【问题标题】:elasticsearch how to find a document with exact word matchelasticsearch如何找到具有精确单词匹配的文档
【发布时间】:2021-06-24 10:29:35
【问题描述】:

我在 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"
            }
        }
    }
}

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

【问题讨论】:

  • 结果是文档中的数组吗?
  • 不,只是文本。这是确切的结果: "hits": { "total": 2, "max_score": 1.0, "hits": [{id, full_text: some dummy text}, { id: 2, full_text: 我有时会读我的书} ]
  • 匹配查询将在这种情况下工作。您可以添加您尝试过的查询以及索引的映射
  • 根据您的回答,我刚刚尝试过:{ "query": { "match": { "full_text": { "query": "define" } } } } 查找所有文档里面的“定义”二字。但是这个查询也会返回带有“defines”、“defined”等词的文档
  • 你能添加你的映射吗,我认为你的映射中使用了词干分析器,它将令牌减少到根。请添加映射以确认。您将通过 GET index-name/_mappings 获得映射

标签: python database elasticsearch


【解决方案1】:

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

English 分析器默认提供词干提取,即它会将标记分解为词根。为定义/定义创建的令牌是定义 所以定义、定义、定义这三个都是等价的。

{
  "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 没有它,仍然会返回该文档。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2013-03-10
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多