joe*_*joe 3 elasticsearch elastic-stack
我在Elastic中有一个像下面这样的JSON对象。
{
"_source" : {
"version" : 1,
"object_id" : "f1dcae27-7a6f-4fea-b540-901c09b60a15",
"object_name" : "testFileName_for_TestSweepAndPrune",
"object_type" : "",
"object_status" : "OBJ_DELETED",
"u_attributes" : ""
}
Run Code Online (Sandbox Code Playgroud)
}
我这样的字词查询不起作用。
{
"query": {
"term": {
"object_status": "OBJ_DELETED"
}
},
"size": 10000
Run Code Online (Sandbox Code Playgroud)
}
Wile匹配查询在相同条件下也可以正常工作。
{
"query": {
"match": {
"object_status": "OBJ_DELETED"
}
},
"size": 10000
Run Code Online (Sandbox Code Playgroud)
}
想知道这里会发生什么?在这种情况下,如何使术语查询在这里起作用?
要了解term查询为什么无法按预期工作的原因,我们需要检查ElasticSearch处理和保存数据的方式match以及term查询和查询的方式不同。
通常,当您将一些文本保存到ElasticSearch其中时,首先会对其进行分析,然后再进行保存。分析是由分析仪完成的。分析仪很多,但是如果您不指定任何分析仪,则将使用默认分析仪。分析器处理文本,将其转换为标记数组,并保存标记列表。对于每个特定的分析器,如何将文本拆分为令牌的规则是不同的。
处理和保存文本后,您可以对其进行查询。有很多方法可以查询的东西,但你的情况之间的主要区别match和term是match为全文查询,并term为长期级查询。事实是,在全文搜索的情况下,您分析查询字符串的方式与分析查询字段的方式相同。在术语级别查询中,不分析查询字符串。请务必注意。
现在让我们看一下如何"OBJ_DELETED"分析ElasticSearch。为此,我们可以添加简单的文档,如下所示:
curl -X PUT 'localhost:9200/testdata/object/1' -H 'Content-Type: application/json' -d '{ "object_status": "OBJ_DELETED" }'
Run Code Online (Sandbox Code Playgroud)
然后检查所有内容:
curl -X POST 'localhost:9200/testdata/_search?pretty'
Run Code Online (Sandbox Code Playgroud)
应该产生这样的东西:
...
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
{
"_index" : "testdata",
"_type" : "object",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"object_status" : "OBJ_DELETED"
}
}
]
Run Code Online (Sandbox Code Playgroud)
}
现在我们可以检查如何"OBJ_DELETED"分析:
curl -X POST 'localhost:9200/testdata/_analyze?pretty' -H 'Content-Type: application/json' -d '{ "text": "OBJ_DELETED" }'
Run Code Online (Sandbox Code Playgroud)
它输出:
{
"tokens" : [
{
"token" : "obj_deleted",
"start_offset" : 0,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 0
}
]
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它仅将文本转换为小写并将其保存为一个标记。这就是默认分析器的工作方式。现在返回您的查询。match查询之所以有效,是因为查询值"OBJ_DELETED"也可以在底层转换为小写,因此ElasticSearch可以找到它。对于term查询,查询字符串未处理,因此实际上您正在OBJ_DELETED与之进行比较,obj_deleted显然您没有得到结果。
最后一个问题:为什么object_status.keyword适用于term查询?
默认情况下,ElasticSearch为每个文本字段创建其他映射。您可以使用这种元数据。此外,它还允许您以不同的方式处理相同的值。因此,默认情况下,每个文本字段都具有名称keyword为type 关键字的其他映射。keyword不分析字段(只有在需要时才可以对其进行归一化)。这意味着对于默认映射,它将保存您传递给的确切值ElasticSearch(OBJ_DELETED在您的情况下)。
| 归档时间: |
|
| 查看次数: |
1273 次 |
| 最近记录: |