0

我正尝试编写一个Elasticsearch多重匹配查询(使用Java API)来创建一个“搜索即用类型”程序。该查询应用于两个字段,即titledescription,这些字段被分析为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

这是因为您正在使用edgeNGram标记器而不是nGram之一。前者只索引前缀,后者则索引数据的前缀,后缀和子部分。

您的分析定义更改为这个代替,它应该按预期工作:

{ 
    "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