【问题标题】:Elasticsearch match exact termElasticsearch 匹配精确词
【发布时间】:2023-03-30 19:51:01
【问题描述】:

我有一个 Elasticsearch 存储库和一个为我们所谓的“资产”创建文档的应用程序。我需要防止用户创建具有相同“标题”的“资产”。

当用户尝试创建“资产”时,我正在使用标题查询 repo,如果匹配,则会向用户显示错误消息。

我的问题是,当我查询标题时,我得到了多个结果(对于类似的匹配)。

这是我目前的查询:

GET assets-1/asset/_search
{
  "query": {
    "match": {
      "title": {
        "query": "test",
        "operator": "and"
      }
    }
  }
}

我有许多标题为“test 1”、“test 2”、“test bla”的记录,只有一个标题为“test”。

但我得到了以上所有内容。

是否有任何条件或属性我必须添加到查询中以便完全匹配该术语?

【问题讨论】:

    标签: elasticsearch repository


    【解决方案1】:

    您的标题字段可能已被分析,因此test 标记将匹配包含该标记的任何标题。

    为了实现完全匹配,您需要有一个 not_analyzed 字段并对其进行 term 查询。

    您需要将title 字段的映射更改为:

    curl -XPUT localhost:9200/assets-1/_mapping/asset -d '{
       "asset": {
          "properties": {
             "title": {
                "type": "string",
                "fields": {
                   "raw": {
                       "type": "string",
                       "index": "not_analyzed"
                   }
                }
             }
          }
       }
    }'
    

    然后您需要重新索引您的数据,然后您就可以像这样运行完全匹配查询:

    curl -XPOST localhost:9200/assets-1/asset/_search -d '{
       "query": {
          "term": {
             "title.raw": "test"
          }
       }
    }'
    

    【讨论】:

    • 谢谢 +Val,该字段已经“not_analyzed”,但“.raw”部分成功了。
    • 太棒了,很高兴你知道了!!
    • 还有一件事,有没有让它不区分大小写?
    • 是的,可以在索引之前将标题小写,或者您需要一个带有lowercase 标记过滤器的自定义分析器来为您完成。
    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多