【问题标题】:Case insensitive exact match in ElasticSearchElasticSearch 中不区分大小写的完全匹配
【发布时间】:2021-06-29 00:24:59
【问题描述】:

我需要能够查询 ElasticSearch 索引以查看是否有任何文档已经具有如下所示字段的特定值:

"name" : {
      "type" : "text",
      "fields" : {
        "raw" : {
          "type" : "keyword"
        }
      }
 }

我最初打算使用normalizer 执行此操作,但我希望避免对索引本身进行更改。然后我找到了match_phrase query,它几乎正是我需要的。问题是它也会返回部分匹配,只要它们开始相同。例如 - 如果我正在搜索值 this is a test,它将返回以下值的结果:

  • this is a test 1
  • this is a test but i'm almost done now
  • this is a test again

在我的情况下,我可以在返回数据后再次检查代码以查看它是否实际上是不区分大小写的完全匹配,但我对 ElasticSearch 相对较新,我想知道是否有任何方法我可以构造我原来的match_phrase 查询,使其不会返回我上面发布的示例吗?

【问题讨论】:

  • 我认为不使用分析器/标准化器或更改索引没有任何方法可以做到这一点。

标签: elasticsearch elasticsearch-7


【解决方案1】:

对于任何感兴趣的人,我找到了几种不同的方法来做到这一点,第一种 - 执行 match_phrase 查询,然后有一个检查长度的脚本:

GET definitions/_search
{
  "query": {
    "bool":{
      "must":{
        "match_phrase":{
          "name":{
             "query":"Test Name"
          }
        }
      },
      "filter": [
        {
          "script": {
            "script": {
              "source": "doc['name.raw'].value.length() == 9",
              "lang": "painless"
            }
          }
        }
      ]
    }
  }
}

然后我想如果我可以检查脚本中的长度,也许我可以做一个不区分大小写的比较:

GET definitions/_search
{
  "query": {
    "bool": { 
      "filter": [
        {
          "script": {
            "script": {
              "source": "doc['name.raw'].value.toLowerCase() == 'test name'",
              "lang": "painless"
            }
          }
        }
      ]
    }
  }
}

所以这些都是选项。在我的情况下,我担心性能,所以我们只是硬着头皮创建了一个规范化器,允许不区分大小写的比较,所以甚至没有使用这些。但我想我应该把这个扔在这里,因为我无法在其他任何地方找到这些答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    相关资源
    最近更新 更多