私は solr4.1.0 を使用しており、一般的な語句検索を機能させようとしています。これは、「the cat」を検索するときに、このフレーズを含むドキュメントを表示したいが、「the」と「cat」をどこか別のフィールドに含むドキュメントは表示しないことを意味します。
私が持っているもの:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.CommonGramsFilterFactory" words="lang/stopwords.txt" format="snowball" />
<filter class="solr.StopFilterFactory" words="lang/stopwords.txt" format="snowball" enablePositionIncrements="true" />
</analyzer>
</fieldType>
これは、「通常の」単語が stopwords.txt のストップワードと組み合わされたときに、特別なグラム トークンを出力する必要があります。分析ビューでは、これは期待どおりに機能するため、「the cat」は「the_cat cat」に共通グラムされます。
私のクライアントが求めている解決策は、クエリ内のストップ ワードが通常の単語と組み合わせて使用される場合、この正確なフレーズ (stop-word-2-shingle) を持つ要素のみが一致する必要があるというものです。全体的なデフォルトの演算子は引き続き AND です。
たとえば、次のフィールドを持つドキュメントがあります
- ID: 1; タイトル: 自然に囲まれた私の猫。desc: 世界で一番素敵な動物は猫です
- ID: 2; タイトル: 猫は悪です。des: 猫が純粋な悪であることは誰もが知っている
- ID: 3; タイトル: 謎を解く猫。desc: 私たちの猫はシャーロックと呼ばれています
以下は私が達成したいことの例です...基本的に、ユーザーは検索、クエリ、および演算子に関して多かれ少なかれ読み書きができないため、検索は入力を解釈し、「正しいことを行う」必要があります。正しいことは次のとおりです。
- input: cat
result: docs 1, 2, 3 (簡単にするために採点なし) - 入力: cat world
結果: doc 1
AND がデフォルト - 入力: cat everyone
結果: doc 2
AND 複数のフィールドにまたがる - 入力: 猫
結果: doc 1 このフィールドだけに「猫」というフレーズが含まれているため、クエリ中に何らかの方法で魔法のように表示する必要があります - 入力: 素敵な猫
結果: []
"the nice" というフレーズを含むドキュメントはなく、アルゴリズムはこれを一般的な単語フレーズとして解釈するため - 入力: 猫の世界
結果: doc 1 - 入力: 純粋な結果: []
この背後にある理由は、クライアントがいくつかの (慎重に選択された) ストップ ワードに関していくつかの特定のアイデアを持っているということです。
それで、これはそれを行う現実的な方法ですか?solrに渡す前に、何らかのクエリの事前解析を行う必要がありますか? 望ましい結果を達成する他の方法はありますか?