2017-05-21 4 views
0

私はLuceneでSQLのLIKE機能を複製しようとしています。luceneの文のLIKE機能

私はワイルドカードを使用して検索する場合は、「チューリップインRiyadhhは、* *」私は、次の行動に直面してると言う:

  1. チューリップインリヤド - マッチング
  2. チューリップインRiyadhhhss -
  3. に一致しません
  4. チューリップインリヤドのhhss -
  5. チューリップマッチング -
01のマッチング -
  • Riyadhhをマッチング

    実際には、条件 "2"が一致し、 "4"が一致しないはずのLuceneの例が必要です。

    すべてのクエリで試しましたが、2番目のシナリオが一致しません。

    Tokenizerとカスタムアナライザを使用することをお勧めする人もいます。

    私はLuceneを初めて使い慣れたので、私はクエリで作業しましたが、Tokenizerとカスタムアナライザをクエリに統合する方法はわかりません。

  • +0

    検索に関連するフィールドのアナライザチェーンを追加すると、試したクエリで使用されるすべてのパラメータと使用しているSolrのバージョンが大きく役立ちます。 – freedev

    答えて

    0

    あなたはのみ前方一致が必要な場合は、LowercaseFilterとEdgeNgramFilterでKeywordTokenizerを使用することができます。

    <analyzer> 
        <tokenizer class="solr.KeywordTokenizerFactory"/> 
        <filter class="solr.LowerCaseFilterFactory"/> 
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="50"/> 
    </analyzer> 
    

    このチェーンは、次に変換し、単一のトークン(KeywordTokenizer)として入ってくるテキストを維持します文字列の長さに基づいて複数のトークンに分割する前に、入力テキストを小文字(LowerCaseFilter)に変換します。

    あなたはどこでも、文字列内で一致させたい場合は、プレーンなngramfilter使用することができます。

    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/> 
    

    を..しかし、minとmaxの間に差がある場合は、あなたのインデックスのサイズが急速に成長することに注意してください大。

    また、*foo*クエリ条件用に特に調整されたReversedWildcardFilterを使用しているので、各トークンの処理(たとえば、それぞれのトークンのステミングなど)が不要な場合は、それはオプションかもしれない。

    関連する問題