web-dev-qa-db-ja.com

空白を含むSolrワイルドカードクエリ

次のようなワイルドカードクエリがあります。

q=location:los a*

「ロサンゼルス」「ロスアルトス」に合わせて欲しいです。次のようなクエリ:

q=los*

正常に機能しますが、空白を追加するとすぐに結果が得られません。ワイルドカードクエリで空白を使用するにはどうすればよいですか?

21
tbaz

私は最近この問題に自分で遭遇しました、そしてあなたがする必要があるのはあなたのクエリのスペースをエスケープすることだけであるようです。元のクエリは、Solrによって次のように解釈されます。

location:los id:a*

(「id」がデフォルトの検索フィールドであると想定)

ただし、クエリを次のように記述する場合:

location:los\ a*

次に、次のように解析されることになります。

location:los a*

そして、上記はあなたが望む結果をもたらすはずです(あなたのデータが適切に索引付けされていると仮定して)。

ヒント:これらすべてを理解するのは簡単です。クエリを送信するときに使用するURLの末尾に&debugQuery=onを追加するだけで、Solrによってどのように解析されたかを確認できます。

34
Aubergine

複雑なクエリパーサーを使用した問題の解決策:

q={!complexphrase inOrder=true}location:"los a*"

複雑なフレーズクエリパーサーの詳細については、このリンクをチェックしてください! https://cwiki.Apache.org/confluence/display/solr/Other+Parsers#OtherParsers-ComplexPhraseQueryParser

3
Jaikumar

構成が表示されない場合は、おそらく空白でトークン化するため、KeywordTokenizerFactoryを使用します。

1
Okke Klein

Solrプレフィックスクエリプラグインをサフィックスのワイルドカードにのみ使用している場合は、それをお勧めします http://lucene.Apache.org/solr/4_0_0/solr-core/org/Apache/solr/ search/PrefixQParserPlugin.html

使用例

http://localhost:8983/solr/collection/select?q={!prefix%20f=name}Bob%20Smi

「BobSmith」または「BobSmit」と一致しますが、( "Bob" OR "Smi *")のチェックに変換されません。 q=name:Bob%20Smi*の行

これが見つかる前に何時間も壁に頭をぶつけていたので、これがあなたや簡単な解決策を探している他の誰かの助けになることを願っています!

1
Rob

これを使用

q=location:los/ a*

の代わりに

q=location:los a*
0
Sourabh Jain

私のプロジェクトでも同じ問題がありました。空白と一緒に単語を検索していたときは、結果が得られませんでした。そこで、インデックス付けとクエリの実行中に、空白をハイフン「-」に置き換えました。以下は、以前使用していたschema.xmlスニペットです。

<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="250"/>
<filter class="solr.LowerCaseFilterFactory"/>
  <filter class="solr.TrimFilterFactory" />
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="([/\s+])" replacement="-" replace="all"
    />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="250"/>
<filter class="solr.LowerCaseFilterFactory"/>
 <filter class="solr.TrimFilterFactory" />
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="([/\s+])" replacement="-" replace="all"
    />
</analyzer>
</fieldType>
0
Rizwan Khan

私のために働いた

<fieldtype name="text_like" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="1000"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.LowerCaseTokenizerFactory"/>
    </analyzer>
</fieldtype>

とクエリfield:*some\ phrase*(Javaリテラルでは\を\\としてエスケープする必要があります)。

0
Oleg Efimov

あなたはこのような設定を使うべきだと思います

  <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
     <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement=""   replace="all" />
    </analyzer>
  </fieldType>

そして、あなたは検索のためにあなたの入力キーワードを削除空白として扱う必要があります

0
Anh Tuan

クエリ(空白のトークナイザーがあると仮定):q = location:los a *は、単語「los」と「a」で始まる単語でドキュメントを検索することを意味します。

Solr(私が知っている限り)は、ある単語(または用語)が別の単語の前に表示されるかどうかを判断できません。

0
shem