次のようなワイルドカードクエリがあります。
q=location:los a*
「ロサンゼルス」「ロスアルトス」に合わせて欲しいです。次のようなクエリ:
q=los*
正常に機能しますが、空白を追加するとすぐに結果が得られません。ワイルドカードクエリで空白を使用するにはどうすればよいですか?
私は最近この問題に自分で遭遇しました、そしてあなたがする必要があるのはあなたのクエリのスペースをエスケープすることだけであるようです。元のクエリは、Solrによって次のように解釈されます。
location:los id:a*
(「id」がデフォルトの検索フィールドであると想定)
ただし、クエリを次のように記述する場合:
location:los\ a*
次に、次のように解析されることになります。
location:los a*
そして、上記はあなたが望む結果をもたらすはずです(あなたのデータが適切に索引付けされていると仮定して)。
ヒント:これらすべてを理解するのは簡単です。クエリを送信するときに使用するURLの末尾に&debugQuery=on
を追加するだけで、Solrによってどのように解析されたかを確認できます。
複雑なクエリパーサーを使用した問題の解決策:
q={!complexphrase inOrder=true}location:"los a*"
複雑なフレーズクエリパーサーの詳細については、このリンクをチェックしてください! https://cwiki.Apache.org/confluence/display/solr/Other+Parsers#OtherParsers-ComplexPhraseQueryParser
構成が表示されない場合は、おそらく空白でトークン化するため、KeywordTokenizerFactoryを使用します。
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*
の行
これが見つかる前に何時間も壁に頭をぶつけていたので、これがあなたや簡単な解決策を探している他の誰かの助けになることを願っています!
これを使用
q=location:los/ a*
の代わりに
q=location:los a*
私のプロジェクトでも同じ問題がありました。空白と一緒に単語を検索していたときは、結果が得られませんでした。そこで、インデックス付けとクエリの実行中に、空白をハイフン「-」に置き換えました。以下は、以前使用していた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>
私のために働いた
<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リテラルでは\を\\としてエスケープする必要があります)。
あなたはこのような設定を使うべきだと思います
<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>
そして、あなたは検索のためにあなたの入力キーワードを削除空白として扱う必要があります
クエリ(空白のトークナイザーがあると仮定):q = location:los a *は、単語「los」と「a」で始まる単語でドキュメントを検索することを意味します。
Solr(私が知っている限り)は、ある単語(または用語)が別の単語の前に表示されるかどうかを判断できません。