2

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

そのため、インデックス作成時にのみ EdgeNgramFilterFactory を有効にしました。プレフィックス検索は正常に機能しますが、正確なフレーズ検索は機能しなくなりました。

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

ありがとう!

ここに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>

また、WordDelimiterFilterFactory を使用すると、強調表示がうまく機能しないことに気付きました。

4

3 に答える 3

5

EdgeNGram は追加の用語を生成し、単語の各チャンクの用語位置を (驚くべきことに) 増やすため、フレーズ検索は機能しません。句は正確であることが期待されます。つまり、2 つの連続する用語間の距離 (スロップ) は 1 です。を使用してテキスト「Hello World」にインデックスを付けたとします<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" side="front"/>。インデックス付きのテキストは、"he hel hell hello wo wor worl world" のようになります。「hello world」ではなく「hel hell」というフレーズが見つかります。

ここに画像の説明を入力

オプションとして、クエリ パーサーのqsパラメータ ( dismax ) を増やすことで、単語間の距離をある程度許容できます。

ただし、「まったく同じフレーズではない」検索は、「ヘル ヘル」などの予期しないフレーズが追加されるため、受け入れられない場合があります。

より良いオプションは、 ngrams に別のフィールドを使用することです。この場合、テキストは 2 つのフィールドでインデックス化され、ngram は元のテキストを壊しません。

于 2012-02-07T01:28:00.377 に答える
2

2 つのフィールドを使用できます。1 つはプレフィックスとサフィックスの検索用で、もう 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 の一致をより高くランク付けできます。

于 2012-02-09T16:17:00.123 に答える
0

さらに別のオプションは、ワイルドカードがクエリの分析を妨げないため、3.6.0 にアップグレードすることです。

于 2012-06-02T07:47:02.543 に答える