0

私はElasticsearchのマルチマッチクエリ(Java APIを使用)を作成して、 "タイプに合わせた検索"プログラムを作成しようとしています。クエリは、titledescriptionの2つのフィールドに適用され、ngramで分析されます。私のElasticsearchマルチマッチクエリは、プレフィックスのみを検索するのはなぜですか?

私の問題は、Elasticsearchが、という単語の最初の部分を検索しようとしているようです。は私の質問と同じです。例えば、私は「ナット」を検索すると、それは「ナット」、「ナッツ」、「ヌテッラ」をフィーチャーした文書などで一致したが、それは「クルミ」をフィーチャーした文書と一致していません、 と一致する必要があります。ここで

は私の設定です:ここでは

{ 
    "index": { 
     "analysis": { 
      "analyzer": { 
       "edgeNGramAnalyzer": { 
        "tokenizer": "edgeTokenizer", 
        "filter": [ 
         "word_delimiter", 
         "lowercase", 
         "unique" 
        ] 
       } 
      }, 
      "tokenizer": { 
       "edgeTokenizer": { 
        "type": "edgeNGram", 
        "min_gram": "3", 
        "max_gram": "8", 
        "token_chars": [ 
        "letter", 
        "digit" 
        ] 
       } 
      } 
     } 
    } 
} 

は私のマッピングの関連する部分である:

{ 
    "content": { 
     "properties": { 
      "title": { 
       "type": "text", 
       "analyzer": "edgeNGramAnalyzer", 
       "fields": { 
        "sort": { 
         "type": "keyword" 
        } 
       } 
      }, 
      "description": { 
       "type": "text", 
       "analyzer": "edgeNGramAnalyzer", 
       "fields": { 
        "sort": { 
         "type": "keyword" 
        } 
       } 
      } 
     } 
    } 
} 

そしてここでは、私のクエリです:

new MultiMatchQueryBuilder(query).field("title", 3).field("description", 1).fuzziness(0).tieBreaker(1).minimumShouldMatch("100%") 

あなたが任意のアイデアを持っていますか私は何が間違っている可能性がありますか?

答えて

1

nGramの代わりにedgeNGramトークナイザを使用しているためです。前者は接頭辞のみを索引付けし、後者は接頭辞、接尾辞、およびデータの下位部分を索引付けします。

代わりにこれにあなたのアナライザ定義を変更

し、期待どおりに動作するはずです:

{ 
    "index": { 
     "analysis": { 
      "analyzer": { 
       "edgeNGramAnalyzer": { 
        "tokenizer": "edgeTokenizer", 
        "filter": [ 
         "word_delimiter", 
         "lowercase", 
         "unique" 
        ] 
       } 
      }, 
      "tokenizer": { 
       "edgeTokenizer": { 
        "type": "nGram",   <---- change this 
        "min_gram": "3", 
        "max_gram": "8", 
        "token_chars": [ 
        "letter", 
        "digit" 
        ] 
       } 
      } 
     } 
    } 
} 
+0

はありがとうございました!それは動作し、あなたは私に何時間ものデバッグをさせてくれました! – Daneel

+0

恐ろしい、それはうまくいった;-) – Val

関連する問題