在文本字段上使用术语查询的ElasticSearch

dffbzjpn  于 2022-12-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(127)

我对术语查询在文本字段上的工作方式有点困惑(我甚至不知道在文本字段上使用它们是否合适)。
这是我的指数使用标准分析仪:

{
  "my-index-000001" : {
    "mappings" : {
      "properties" : {
        "city" : {
          "type" : "text",
          "fields" : {
            "raw" : {
              "type" : "keyword"
            }
          }
        }
      }
    }
  }
}

这是它目前掌握的数据:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "city" : "New York"
        }
      },
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "city" : "York"
        }
      }
    ]
  }
}

使用此查询将匹配索引中的两个文档:

GET my-index-000001/_search
{
  "from":0,"size":20,"timeout":"20s",
"query": {
    "wildcard": {
      "city": {
        "value": "yor*"
      }
    }
  }
}

如您所见,查询中的大小写与任何现有文档都不匹配(两个文档都包含约克)。此外,如果查询“yOR*”,两个文档仍然匹配。当我查询字段“city.raw”时,这是一个关键字字段,将没有匹配。
根据to docs,术语级查询不应该分析搜索术语,如果字段类型是文本,这似乎是不正确的。这是有意的还是一个bug?在文本字段上使用术语查询安全吗?(如果不安全,为什么?)
谢谢你。

ldfqzlk8

ldfqzlk81#

当您有一个"keyword"类型的字段时,文本将按照它在Elasticsearch中的样子被索引,而不是在索引时被分析。

***例如:***"New York"存储为“纽约”

当字段为text类型时,文本在索引时间本身进行分析,并存储在Elasticsearch中。

***例如:***"New York"被分解为"new""york"

因此,您将在“city”字段中搜索"yor*"时找到结果。
documentation中还提到,术语级查询对存储在Elasticsearch中的文本起作用,不执行任何搜索时间分析。
与全文查询不同,术语级查询不分析搜索术语,而是精确匹配存储在字段中的术语。

但是,最好使用带有keyword类型字段的术语级查询

相关问题