3

Autosuggest で solr4 を使用しています (ここでTermsComponent説明されているように)。大文字/小文字を無視する regEx "startsWith"-search を実行しています。

<solr>/terms
?terms.fl=name
&terms=true
&terms.limit=5
&terms.regex=<term>.*
&terms.regex.flag=case_insensitive
&qt=%2Fterms

それが返すもののいくつかの例を挙げましょう:

test -> Test Listing; test lowercase
Test -> Test Listing; test lowercase

残念ながら、このソリューションは分音符号、ウムラウト、アクセントを処理できません..したがって、次の方法は機能しません。

têst -> Test Listing; test lowercase; Têst áccènt
Test -> Test Listing; test lowercase; Têst áccènt

フィールドはstring-トークン化されたものでも試しましたtest_enが、成功しませんでした

<field name="name" type="string" indexed="true" stored="true" required="true" />

このオートサジェストの双方向アクセント検索を有効にする最良の方法は何ですか?


編集: AnalyzerSuggester の変更:

  <searchComponent class="solr.SpellCheckComponent" name="autosuggest">
    <lst name="spellchecker">
      <str name="name">autosuggest</str>
      <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
      <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.AnalyzingLookupFactory</str>
      <str name="storeDir">autosuggest</str>
      <str name="buildOnCommit">true</str>
      <str name="field">asug</str>
      <str name="suggestAnalyzerFieldType">text_asug</str>

      <!-- Suggester properties -->
      <bool name="exactMatchFirst">true</bool>
    </lst>
  </searchComponent>
  <requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/autosuggest">
    <lst name="defaults">
      <str name="spellcheck">true</str>
      <str name="spellcheck.dictionary">autosuggest</str>
      <str name="spellcheck.onlyMorePopular">true</str>
      <str name="spellcheck.count">5</str>
      <str name="spellcheck.collate">true</str>
    </lst>
    <arr name="components">
      <str>autosuggest</str>
    </arr>
  </requestHandler>

.

<fieldType name="text_asug" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ASCIIFoldingFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ASCIIFoldingFilterFactory"/>
      </analyzer>
    </fieldType>
4

2 に答える 2

3

ここでの問題は、コンポーネントという用語が検索とクエリの両方でインデックス付きトークンで機能することです。したがって、Unicode の折り畳みを行う場合 (これはあなたが行うことです)、折り畳まれたテキスト バージョンを保存します。アクセントなしで合わせますが、アクセントなしでも元に戻ります。

次の 2 つのオプションが考えられます。

1) 折りたたまれた用語と折りたたまれていない用語を 1 つのフィールドに格納します。したがって、どういうわけか「テスト アクセント」を「テスト アクセント|テスト アクセント」にマップするようにします。接頭辞「Test..」で照合し、クライアントで 2 番目の用語を抽出します。ただし、それを行う方法は難しい場合があります。

2)代わりにSuggesterを使用します。これはスペルチェッカーの上に構築され、ドキュメントを適切に読んだ場合、代替の field_type を指定できます。そのアナライザーは、suggester のインデックス/クエリ中に使用されます (solrconfig.xml でほとんどドキュメント化されていない queryAnalyzerFieldType パラメーターを使用)。したがって、元のテキストは、折り畳まれた形式で提案にコピーされます。ただし、おそらく、Suggester が何かに一致すると、元の形式が返されます。しかし、よくわかりません。主な理由は、生まれたばかりの Lucene/Solr 4.1 AnalyzingSuggester の機能として宣伝されているためです。実際、この記事ではユースケースを具体的に取り上げています。

大文字と小文字、アクセントなどをフォールディングまたは正規化するアナライザー (たとえば、ICUFoldingFilter を使用) を使用すると、大文字と小文字やアクセントに関係なく、候補が一致します。たとえば、クエリ「ame...」は Amélie を示唆します。

問題は、この時点で自分で完全な例をまとめる必要があることです。案内はほとんどありません。しかし、それ (AnalyzingSuggester) がおそらく最善の策です。

于 2013-02-07T03:59:09.207 に答える
2

おそらくフィールドに似たカスタム fieldType を作成する必要がありますが、これはASCIIFilterFoldingFactorytext_enも実装して、インデックスおよびクエリ時に分音記号の変換を処理します。

于 2013-02-06T17:21:46.517 に答える