3

copyFieldを使用してさまざまなソースフィールドに入力するように定義されたテキストフィールドがあります。目標は、この1つのフィールドをSolrインデックスの検索に使用することです。

このテキストフィールドは、このカスタムfieldType"text_en_splitting_reversed"を使用するように定義されています。このフィールドタイプは、例「text_en_splitting」をコピーし、ReversedWildcardFilterFactoryをインデックスアナライザーに追加することで作成しました。

<!-- Just like text_en_splitting, but with the addition of reversed tokens for leading wildcard matches -->
<fieldType name="text_en_splitting_reversed" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <!-- Case insensitive stop word removal.
      add enablePositionIncrements=true in both the index and query
      analyzers to leave a 'gap' for more accurate phrase queries.
    -->
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="lang/stopwords_en.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" types="word-delim-types.txt" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true"
       maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>
 </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="lang/stopwords_en.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"  types="word-delim-types.txt" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>

私の主な問題:先頭のワイルドカードを使用して検索すると、予期しない結果が得られます。たとえば、「* car」に対して実行している特定の検索では、単一の一致が返されるはずです(ドキュメントには「racecar」という単語が含まれています)。これは失敗していたので、SolrAdminのアナライザーツールでデバッグすることにしました。これが私のテストのスクリーンショットです:

主要なワイルドカードの問題

私はこのアナライザーツールを初めて使用しますが、右側が先頭のアスタリスクをずっと下に保持しているべきではありませんか?そして、なぜこれが一致しないのですか?ユーザーが入力したキーワードの逆処理を行う必要がありますか?

これで、インデックスクエリ設定で、edismaxを使用するように設定されました。ただし、管理アナライザのGUIでは、標準のパーサーとedismaxのどちらを使用しているかを制御する方法がわかりません。(おそらくそれは問題ではありませんか?)

この情報がより多くのコンテキストを提供するのに役立つ可能性がある場合は、インデックス付けされるこの特定のフィールドの目標を実行します。

  • *carをracecarに合わせて欲しいのですが。これは機能していません。
  • $30を含むドキュメントと$30を一致させたいのですが、30を含むドキュメントとは一致させません(ドル記号が前に付いていない場合)。そこで、$をDIGITとして定義するtypes=""属性を追加しました。これ機能しています。
  • 30ドルを含むドキュメントと一致させたいのですが。これは機能していません。
4

2 に答える 2

1

スクリーンショットから、WordDelimiterFilterFactoryが先頭の*を削除したことは明らかです。preserveOriginal="1"クエリアナライザ側に追加してみてください。

<filter class="solr.WordDelimiterFilterFactory" 
    preserveOriginal="1" 
    generateWordParts="1" 
    generateNumberParts="1" 
    catenateWords="0" 
    catenateNumbers="0" 
    catenateAll="0" 
    splitOnCaseChange="1" 
    types="word-delim-types.txt" />
于 2013-02-14T06:00:52.877 に答える
1

最終的に、ワイルドカードの主な問題は、検索エンジンのフロントエンドのバグでした。クエリがSolrに送信される前に、すべてのキーワードまたはフレーズを引用符で囲むコードがあります。このようにフレーズが入力された場合、それは引用符で囲まれ、正常に機能します。また、通常のキーワード検索には影響しません。

ただし、ワイルドカード検索の場合は、引用符で囲むと、何らかの理由で検索が失敗するようです。引用符を削除すると、*carは期待どおりにracecarを含む投稿と一致していました。

2番目の問題(「30」が「$ 30」を含むドキュメントと一致しない理由)に関しては、別のStackOverflowスレッドでこの問題も解決しました。Solrで数字とドル記号を含むドキュメントを見つけるにはどうすればよいですか?

余談ですが、Solr分析管理GUIにバグがあると思います。主要なワイルドカード検索をテストするとき、一致が行われたことを示すハイライトが発生することはありません...これは、問題をデバッグしようとする私の混乱をさらに助長していました。

于 2013-02-14T19:25:14.163 に答える