【问题标题】:Elasticsearch query to get results irrespective of spaces in search text无论搜索文本中的空格如何,Elasticsearch 查询都可以获取结果
【发布时间】:2019-06-21 10:36:51
【问题描述】:

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

【问题讨论】:

  • 我觉得这对你有帮助stackoverflow.com/questions/46402504/…
  • 你想只使用词组前缀匹配还是name字段的一部分也应该匹配?例如,名称 sample name foo 是否匹配 namefamplename
  • 能否向我们展示您使用的映射?特别是对于字段name天气,该字段定义为textkeyword
  • @Dinesh 您能否接受并支持我的回答,因为它解决了您的问题,这将有助于社区轻松找到答案,如果您有后续问题,请告诉我

标签: elasticsearch kibana


【解决方案1】:

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

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

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

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

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

在您的情况下,我将名称字段创建为文本,它使用Ignore spaces in Elasticsearch 中解释的单词连接分析器,当搜索samplen 时,我能够获得由sample name 组成的文档。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    相关资源
    最近更新 更多