首页 > 解决方案 > elasticsearch如何找到具有精确单词匹配的文档

问题描述

我在 ES 中有一些数据。例如

{
result: [{
    id: 1,
    full_text: some dummy text
}, {
    id: 2,
    full_text: i read my book sometimes
}, {
    id: 3,
    full_text: somewhere in time is one of the greatest albums of all time
}]

}

我必须创建一些查询来返回与全文字段中的单词完全匹配的所有文档。例如,如果我想在全文中获取所有带有单词“some”的文档,它必须只返回第一个没有模糊搜索的文档,并且不必考虑诸如“something,somewhere”之类的单词。我尝试使用匹配项,但不返回完全匹配的单词。我也尝试使用正则表达式,但无法创建正确的。例如,这个返回什么都没有,就像“full_text”中没有带有“some”一词的文档一样

{
    "query": {
        "regexp": {
            "summary_text": {
                "value": "\bsome\b"
            }
        }
    }
}

有人知道这种搜索的正确查询或正则表达式吗?

标签: pythondatabaseelasticsearch

解决方案


如果您查看映射,“analyzer”:“english” 用于字段 full_text

英语分析器默认提供词干提取,即它将标记分解为词根。为定义/定义创建的标记是定义,因此定义、定义、定义所有三个都是等价的。

{
  "mappings": {
    "agencies": {
      "full_text": {
        "type": "text",
        "fields": {
          "reverse": {
            "type": "text",
            "analyzer": "reverse"
          },
          "trigram": {
            "type": "text",
            "analyzer": "trigram"
          }
        },
        "copy_to": [
          "light_stem",
          "shingled"
        ],
        "analyzer": "english"
      }
    }
  }
}

您需要更新您的映射并创建一个文本类型的子字段,而无需任何分析器。

如果您将某些子字段定义为反向并复制到 light_stem 和 shingled。您的映射中不存在它们的定义,因此无法在我的最后进行测试。您也可以尝试对这些进行匹配查询。full_text.reverse:“定义”

copy_to 用于将多个字段的值复制到一个地方。您的匹配查询将对这些起作用,但如果任何其他字段(带有 copy_to)具有单词定义但 full_text 没有它,仍然会返回该文档。


推荐阅读