2012-01-19 11 views
2

SOLRクエリの各用語に対して "startsWith"検索を有効にするだけでなく、フレーズ検索(引用符で囲んで)も実行できるようにします。 接頭辞検索では、最初に接尾辞「*」を追加しました。このソリューションは、プレフィックス検索とフレーズ検索の両方を可能にしますが、ワイルドカード検索であり、ワイルドカード検索ではその用語を分析しないため、このソリューションが嫌いです。Solr 3.4.0でEdegeNGram解析とフレーズ検索の両方をサポート

したがって、EdgeNgramFilterFactoryはインデックス作成時のみ有効になりました。プレフィックス検索は正常に機能しますが、正確なフレーズ検索はもう機能しません。

EdgeNgramが有効な場合でもフレーズ検索を有効にする方法を知っている人はいますか?

ありがとうございます!

はここでまた、私はWordDelimiterFilterFactoryを使用するときにハイライトはもう十分に機能していないことに気づいたのschema.xml

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="back" /> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="front" /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 

     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
    </fieldType> 

です。

+0

を分析されているクエリを防ぐことはできません。 –

答えて

5

EdgeNGramが追加用語を生成し、単語の各チャンクのターム位置を(驚くほど)増加させるため、フレーズ検索が機能しません。フレーズは正確であることが期待されます。つまり、連続する2つの語の間の距離(スロープ)は1です。ただし、チャンクではインデックス付きテキストは異なって見えます。 <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" side="front"/>を使用してテキスト「Hello World」に索引付けしたとします。その後、索引付きのテキストは、「彼のこんにちは、こんにちは、worl world」のように見えます。あなたは "hello world"ではなく "hel hell"というフレーズを見つけるでしょう。あなたは適量にクエリパーサ(dismax)のパラメータを増加させることにより、単語の間にいくつかの距離を可能性があります。オプションとして

enter image description here

しかし、 '正確なフレーズではない'検索は、 'hel hell'のような追加の予期しないフレーズが見つかると受け入れられない場合があります。

より良いオプションはuse a separate field for ngramsです。この場合、テキストは2つのフィールドで索引付けされ、ngramは元のテキストを分割しません。

2

接頭辞と接尾辞の検索には2つのフィールドを使用できます。完全一致にはもう1つを使用できます。

<field indexed="true" name="myfield_edgy"  type="edgy"/> 
    <field indexed="true" name="myfield_exactmatch" type="exactmatch"/> 
    <copyField source="myfield_exactmatch" dest="myfield_edgy"/> 

今、あなたは、より高いmyfield_exactmatchで試合をランク付けする、すなわち、両方のフィールドで検索、さらには別のブーストを使用することができます。

0

さらに別のオプションはようになりました3.6.0にアップグレードされたワイルドカードは、我々はあなたが何をしているかを見ることができるように、あなたのschema.xmlを投稿するならばそれが役立つかもしれない

関連する問題