如何使用 multi_match 处理 Elasticsearch 查询结果中的字母数字组合(例如“Hotel101”)?

问题描述 投票:0回答:1

我正在使用 Elasticsearch,我有一个索引,其中包含带有字母数字组合的条目,例如“Hotel101 fort”。当我使用“Hotel 101 fort”这样的查询进行搜索时,我没有得到正确的结果,因为 Elasticsearch 将查询拆分为单独的标记,例如“Hotel”、“101”和“fort”,但索引文档已标记化如“Hotel101”和“fort”。

我的目标是确保文档中的“Hotel101”与“Hotel 101 fort”之类的查询匹配,而无需在查询中显式指定分析器。这是我迄今为止尝试过的:

我正在使用 multi_match 查询来跨多个字段进行搜索。 我已经使用 ngram 和同义词过滤器定义了自定义分析器,但问题仍然存在。

我尝试过的: 我尝试使用 ngram 进行部分匹配,但这对字母数字组合的完整标记化没有帮助。 我还使用了同义词过滤器,但随后我必须将所有可能的字母数字实例输入到同义词列表中,这似乎非常低效。

如何配置 Elasticsearch 在索引和查询过程中将诸如“Hotel101”和“Hotel 101”之类的字母数字组合处理为相同的标记,而无需在每个查询中指定分析器?

spring-boot elasticsearch search lucene full-text-search
1个回答
0
投票

您需要将单词分隔符标记过滤器与自定义分析器一起使用。

以下是示例配置:

索引映射:

PUT test3
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom", 
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "word_delimiter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title":{
        "type": "text",
        "analyzer": "my_custom_analyzer"
      }
    }
  }
}

示例文档

POST test3/_doc/1
{
  "title":"Hotel101 fort"
}

示例查询

POST test3/_search
{
  "query": {
    "match": {
      "title": "Hotel 101 fort"
    }
  }
}

回复

{
  "hits": [
    {
      "_index": "test3",
      "_id": "1",
      "_score": 0.8630463,
      "_source": {
        "title": "Hotel101 fort"
      }
    }
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.