我对术语查询在文本字段上的工作方式有点困惑(我甚至不知道在文本字段上使用它们是否合适)。
这是我的指数使用标准分析仪:
{
"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?在文本字段上使用术语查询安全吗?(如果不安全,为什么?)
谢谢你。
1条答案
按热度按时间ldfqzlk81#
当您有一个
"keyword"
类型的字段时,文本将按照它在Elasticsearch中的样子被索引,而不是在索引时被分析。***例如:***
"New York"
存储为“纽约”当字段为
text
类型时,文本在索引时间本身进行分析,并存储在Elasticsearch中。***例如:***
"New York"
被分解为"new"
和"york"
因此,您将在“city”字段中搜索
"yor*"
时找到结果。documentation中还提到,术语级查询对存储在Elasticsearch中的文本起作用,不执行任何搜索时间分析。
与全文查询不同,术语级查询不分析搜索术语,而是精确匹配存储在字段中的术语。
但是,最好使用带有
keyword
类型字段的术语级查询