【问题标题】:Elasticsearch 5.6 multi_match search with edge_ngram returning zero resultsElasticsearch 5.6 multi_match 搜索,edge_ngram 返回零结果
【发布时间】:2020-10-01 22:31:29
【问题描述】:

我在 Elasticsearch 中有如下文档:

{
  "_index" : "demo_index",
  "_type" : "doc",
  "_id" : "user_122",
  "_version" : 4,
  "found" : true,
  "_source" : {
    "id" : 1520488,
    "doc_type" : "user",
    "user_email" : "neeraj@test.com",
    "user_first_name" : "Neeraj",
    "user_last_name" : "Goel"
  }
}

以下是返回零结果的查询。

注意:仅当全名在索引中分为 user_first_nameuser_last_name 字段时才会发生这种情况。

{
  "index": "demo_index",
  "type": "doc",
  "body": {
    "from": 0,
    "size": "200",
    "query": {
      "bool": {
        "must": [
          {
            "term": {
              "doc_type": "user"
            }
          },
          {
            "term": {
              "user_status": 1
            }
          },
          {
            "multi_match": {
              "query": "neeraj goel",
              "operator": "AND",
              "fuzziness": "AUTO",
              "fields": [
                "user_first_name.edge_ngram",
                "user_last_name.edge_ngram"
              ]
            }
          }
        ],
        "should": {
          "prefix": {
            "user_first_name.sort": "neeraj goel"
          }
        }
      }
    },
    "sort": {
      "_score": {
        "order": "desc"
      }
    }
  }
}

索引中使用的edge_ngram设置为:

{
  "edge_ngram_tokenizer": {
    "token_chars": [
      "letter"
    ],
    "min_gram": "2",
    "type": "edge_ngram",
    "max_gram": "8"
  }
}

映射:

{
  "user_first_name": {
    "type": "text",
    "fields": {
      "edge_ngram": {
        "type": "text",
        "analyzer": "edge_ngram_analyzer"
      },
      "ngram": {
        "type": "text",
        "analyzer": "ngram_analyzer"
      },
      "raw": {
        "type": "keyword"
      }
    },
    "analyzer": "standard"
  }
}

我无法弄清楚我的查询出了什么问题,因为如上所述,当文档中没有 user_last_name 时,查询工作正常。

谁能帮我解决这个问题。

谢谢。

【问题讨论】:

  • 您提供的数据不足以重现问题,请更清楚地说明您想要实现的目标

标签: elasticsearch elasticsearch-5


【解决方案1】:

由于您的索引设置和映射不完整,并且不清楚您想要实现什么,我添加了一个适用于您的用例的示例,我理解并会在您添加更多数据后更改它.

带有映射和设置的索引定义

{
    "settings": {
        "analysis": {
            "analyzer": {
                "edge_ngram_analyzer": {
                    "tokenizer": "edge_ngram_tokenizer"
                },
                "ngram_analyzer": {
                    "tokenizer": "ngram_tokenizer"
                }
            },
            "tokenizer": {
                "edge_ngram_tokenizer": {
                    "token_chars": [
                        "letter"
                    ],
                    "min_gram": "2",
                    "type": "edge_ngram",
                    "max_gram": "8"
                },
                "ngram_tokenizer": {
                    "token_chars": [
                        "letter"
                    ],
                    "min_gram": "2",
                    "type": "ngram",
                    "max_gram": "8"
                }
            }
        },
        "index.max_ngram_diff": 10 // note this
    },
    "mappings": {
        "properties": {
            "user_first_name": {
                "type": "text",
                "fields": {
                    "edge_ngram": {
                        "type": "text",
                        "analyzer": "edge_ngram_analyzer"
                    },
                    "ngram": {
                        "type": "text",
                        "analyzer": "ngram_analyzer"
                    },
                    "raw": {
                        "type": "keyword"
                    }
                },
                "analyzer": "standard"
            },
            "user_last_name": {
                "type": "text",
                "fields": {
                    "edge_ngram": {
                        "type": "text",
                        "analyzer": "edge_ngram_analyzer"
                    },
                    "ngram": {
                        "type": "text",
                        "analyzer": "ngram_analyzer"
                    },
                    "raw": {
                        "type": "keyword"
                    }
                },
                "analyzer": "standard"
            }
        }
    }
}

并将示例文档添加到索引中

{
   "user_first_name" : "Neeraj",
   "user_last_name" : "Goel"
}

搜索查询

{
    "query": {
        "bool": {
            "must": [
                {
                    "multi_match": {
                        "query": "neeraj goel",
                        "operator": "or", // note this
                        "fuzziness": "AUTO",
                        "fields": [
                            "user_first_name.edge_ngram",
                            "user_last_name.edge_ngram"
                        ]
                    }
                }
            ],
            "should": {
                "prefix": {
                    "user_first_name.sort": "neeraj goel"
                }
            }
        }
    }
}

以及搜索结果

"hits": [
            {
                "_index": "myindexedge",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0500396,
                "_source": {
                    "user_first_name": "Neeraj",
                    "user_last_name": "Goel"
                }
            }
        ]

【讨论】:

  • 您好,我正在尝试更新索引设置,但出现错误。索引设置更新查询: curl -X PUT "localhost:9200/myindex/_settings?pretty" -H 'Content-Type: application/json' -d' { "index" : { "max_ngram_diff" : 10 } } ' 错误: "root_cause" : [ { "type" : "illegal_argument_exception", "reason" : "unknown setting [index.max_ngram_diff] 请检查是否安装了任何必需的插件,或检查已删除设置的重大更改文档" } ]
  • @NeelkanthKaushik,您需要在更新设置之前关闭索引,为此使用 XPUT http:localhost:9200//_close ,然后更新设置,打开索引, ` XPUT http:localhost:9200//_open` 并再次重新索引您的数据。
  • 我删除了集群中的所有索引,然后尝试创建新索引,但仍然出现相同的错误; {"error":{"root_cause":[{"type":"illegal_argument_exception","re​​ason":"unknown setting [index.max_ngram_diff] 请检查是否安装了任何必需的插件,或检查重大更改文档以了解已删除的设置"}],"type":"illegal_argument_exception","re​​ason":"未知设置 [index.max_ngram_diff] 请检查是否安装了任何必需的插件,或检查已删除设置的重大更改文档"},"status":400 }
  • 我的ES版本是5.6.14
  • @NeelkanthKaushik 它与 ES 版本无关,您能否通过设置显示您创建索引的完整请求?
猜你喜欢
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2021-04-19
相关资源
最近更新 更多