次のようなワイルドカード クエリがあります。
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
私のために働いた
<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 リテラルでは、\ を \\ としてエスケープする必要があります)。
あなたの設定を見なくても、おそらく今は空白でトークン化しているので、 KeywordTokenizerFactory を使用すると思います。
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
"Bob Smith" または "Bob Smit" に一致しますが、("Bob" OR "Smi*") のチェックには変換されません。q=name:Bob%20Smi*
これを見つける前に何時間も壁に頭をぶつけていたので、これがあなたや簡単な解決策を探している他の誰かの助けになることを願っています!
クエリ (空白トークナイザーがあると仮定): q=location:los a* は、「los」という単語と「a」で始まる単語を含むドキュメントを検索することを意味します。
Solr (私が知っている限り) は、ある単語 (または用語) が別の単語の前にあるかどうかを判断できません。