Elasticsearch查询以获取结果,而与搜索文本中的空格无关

时间:2019-06-21 10:36:51

标签: elasticsearch kibana

我正在尝试从 name 字段中的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中实现这一目标?

1 个答案:

答案 0 :(得分:1)

首先,您需要了解Elasticsearch的工作原理,以及为什么给出结果而没有给出结果。

ES处理令牌匹配,您在ES中建立索引的文档经过analysis流程,并将由此过程生成的令牌创建并存储到用于搜索的反向索引中。

现在,当您进行查询时,该查询还会生成搜索令牌,如果是词条查询,则可以是搜索查询中的令牌,如果是匹配查询,则可以是基于在搜索字段上定义的分析器的令牌。因此,了解搜索查询的内部结构非常重要。

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

您可以使用Explain API来了解查询的内部信息,例如您的搜索查询生成哪些搜索令牌,如何与之匹配的文档以及如何计算得分。

在您的情况下,我将名称字段创建为文本,它使用Ignore spaces in Elasticsearch中解释的joined Analyzer这个词,并且在搜索{{1时,我可以得到由sample name组成的文档}}。

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