将 ngram 与 elasticsearch 一起使用时带回所有相关结果

Posted

技术标签:

【中文标题】将 ngram 与 elasticsearch 一起使用时带回所有相关结果【英文标题】:Bring back all relevant results when using ngrams with elasticsearch 【发布时间】:2020-05-10 02:10:14 【问题描述】:

我使用 ngram 为我的 elasticsearch 索引编制了索引,以便可以快速进行模糊匹配和前缀搜索。我注意到,如果我在名称字段中搜索包含“Bob”的文档,则只有结果 name = Bob 返回。我希望响应包含名称 = Bob 的文档,但 文档名称 = Bobbi、Bobbette 等。 Bob 结果应该有一个比较高的分数。不完全匹配的其他结果仍应出现在结果集中,但分数较低。如何使用 ngrams 实现这一目标?

我正在使用一个非常小的简单索引进行测试。该索引包含两个文档。

 
    "_index": "contacts_4",
    "_type": "_doc",
    "_id": "1",
    "_score": 1.0,
    "_source": 
      "full_name": "Bob Smith"
    
  ,
  
    "_index": "contacts_4",
    "_type": "_doc",
    "_id": "2",
    "_score": 1.0,
    "_source": 
      "full_name": "Bobby Smith"
    
  

【问题讨论】:

请添加您正在使用的映射和查询 【参考方案1】:

这是一个工作示例(使用 n-gram 标记器):

ngram-tokenizer

映射

  PUT my_index
  
  "settings": 
    "analysis": 
      "analyzer": 
        "my_analyzer": 
          "filter": [
            "lowercase"
          ],
          "type": "custom",
          "tokenizer": "my_tokenizer"
        
      ,
      "tokenizer": 
        "my_tokenizer": 
          "token_chars": [
            "letter",
            "digit"
          ],
          "min_gram": "3",
          "type": "ngram",
          "max_gram": "4"
        
      
    
  ,
  "mappings": 
    "properties": 
      "full_name": 
        "type": "text",
        "analyzer": "my_analyzer",
        "fields": 
          "keyword": 
            "type": "keyword"
          
        
      
    
  

索引文档

POST my_index/_doc/1

  "full_name":"Bob Smith"


POST my_index/_doc/2

  "full_name":"Bobby Smith"


POST my_index/_doc/3

  "full_name":"Bobbette Smith"

搜索查询

GET my_index/_search

  "query": 
    "match": 
      "full_name": "Bob"
    
  

结果

"hits" : [
  
    "_index" : "my_index",
    "_type" : "_doc",
    "_id" : "1",
    "_score" : 0.1626403,
    "_source" : 
      "full_name" : "Bob Smith"
    
  ,
  
    "_index" : "my_index",
    "_type" : "_doc",
    "_id" : "2",
    "_score" : 0.13703513,
    "_source" : 
      "full_name" : "Bobby Smith"
    
  ,
  
    "_index" : "my_index",
    "_type" : "_doc",
    "_id" : "3",
    "_score" : 0.11085624,
    "_source" : 
      "full_name" : "Bobbette Smith"
    
  
]

希望对你有帮助

【讨论】:

以上是关于将 ngram 与 elasticsearch 一起使用时带回所有相关结果的主要内容,如果未能解决你的问题,请参考以下文章

[Elasticsearch] 部分匹配 - 索引期间优化ngrams及索引期间的即时搜索

elasticsearch ngram 和 postgresql trigram 搜索结果不匹配

Elasticsearch:使用 search_analyzer 及 edge ngram 来实现 Search-As-You-Type

Elasticsearch:使用 search_analyzer 及 edge ngram 来实现 Search-As-You-Type

如何在Elasticsearch中使用ngram时控制结果的评分或排序?

Elasticsearch 荧光笔误报