首页 > 解决方案 > 无论搜索文本中的空格如何,Elasticsearch 查询都可以获取结果

问题描述

我正在尝试从字段名称匹配的 Elasticsearch 中获取数据。我有以下两条记录

{
  "_index": "sam_index",
  "_type": "doc",
  "_id": "key",
  "_version": 1,
  "_score": 2,
  "_source": {
    "name": "Sample Name"
  }
}

{
  "_index": "sam_index",
  "_type": "doc",
  "_id": "key1",
  "_version": 1,
  "_score": 2,
  "_source": {
    "name": "Sample Name"
  }
}

当我尝试使用sam、sample、Sa 等文本进行搜索时,我可以使用 match_phrase_prefix 查询来获取这两条记录。我尝试使用 match_phrase_prefix 的查询是

GET sam_index/doc/_search
{
  "query": {
    "match_phrase_prefix" : {
      "name": "sample"
    }
  }
}

当我尝试使用字符串samplen进行搜索时,我无法获取记录。无论文本之间的空格如何,我都需要搜索并获得结果。如何在 Elasticsearch 中实现这一点?

标签: elasticsearchkibana

解决方案


首先,您需要了解 Elasticsearch 是如何工作的,以及为什么它会给出结果而不给出结果。

ES 处理令牌匹配,您在 ES 中索引的文档经过分析过程,并创建并存储从该过程生成的令牌到用于搜索的倒排索引。

现在,当您进行查询时,该查询还会生成搜索标记,这些标记可以是搜索查询中的术语查询,也可以是基于搜索字段上定义的分析器的标记(如果是匹配查询)。因此,了解搜索查询的内部结构非常重要。

此外,了解索引的映射非常重要,ES 默认在文本字段上使用标准分析器。

您可以使用Explain API 了解查询的内部结构,例如您的搜索查询生成了哪些搜索标记、文档如何与之匹配以及计算得分的依据。

在您的情况下,我将名称字段创建为文本,它使用在 Elasticsearch 中忽略空格中解释的单词连接分析器,并且我能够获得sample name搜索时包含的文档samplen

让我们知道您是否也想实现相同的目标以及它是否可以解决您的问题。


推荐阅读