elasticsearch 简单术语查询在匹配工作时不使用弹性查询,elasticsearch,elastic-stack,elasticsearch,Elastic Stack" /> elasticsearch 简单术语查询在匹配工作时不使用弹性查询,elasticsearch,elastic-stack,elasticsearch,Elastic Stack" />

elasticsearch 简单术语查询在匹配工作时不使用弹性查询

elasticsearch 简单术语查询在匹配工作时不使用弹性查询,elasticsearch,elastic-stack,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",

我在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" : ""
    }
}

像这样的术语查询不起作用

{
            "query": {
                "term": {
                    "object_status": "OBJ_DELETED"
                }
            },
            "size": 10000
}

Wile match查询在相同条件下运行良好

{
            "query": {
                "match": {
                    "object_status": "OBJ_DELETED"
                }
            },
            "size": 10000
}


想知道这里会发生什么?在这种情况下,如何使术语查询在这里工作?

要理解为什么
术语
查询没有按预期工作,我们需要检查
弹性搜索
如何处理和保存数据,以及
匹配
术语
查询是如何不同的

通常,当您将一些文本保存到
ElasticSearch
中时,会先对其进行分析,然后再保存。分析由以下人员完成。有许多分析器,但是如果您没有指定任何分析器,那么将使用默认的分析器。Analyzer处理文本,将其转换为令牌数组并保存令牌列表。对于每个特定的分析器,如何将文本拆分为标记的规则是不同的

在处理和保存文本时,您可以查询它。查询内容的方法有很多种,但在您的例子中,
match
term
之间的主要区别在于
match
是和
term
是。问题是,在全文搜索的情况下,查询字符串的分析方法与正在查询的字段的分析方法相同。术语级查询中未分析查询字符串。注意这一点很重要

现在让我们看看
ElasticSearch如何分析
“OBJ_DELETED”
。为此,我们可以添加如下简单文档:

curl -X PUT 'localhost:9200/testdata/object/1' -H 'Content-Type: application/json' -d '{ "object_status": "OBJ_DELETED"  }'
...
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
  {
    "_index" : "testdata",
    "_type" : "object",
    "_id" : "1",
    "_score" : 1.0,
    "_source" : {
      "object_status" : "OBJ_DELETED"
    }
  }
]
然后检查所有东西是否都在:

curl -X POST 'localhost:9200/testdata/_search?pretty'
应该产生这样的结果:

curl -X PUT 'localhost:9200/testdata/object/1' -H 'Content-Type: application/json' -d '{ "object_status": "OBJ_DELETED"  }'
...
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
  {
    "_index" : "testdata",
    "_type" : "object",
    "_id" : "1",
    "_score" : 1.0,
    "_source" : {
      "object_status" : "OBJ_DELETED"
    }
  }
]
}

现在我们可以检查如何分析
“OBJ_DELETED”

curl -X POST 'localhost:9200/testdata/_analyze?pretty' -H 'Content-Type: application/json' -d '{ "text": "OBJ_DELETED"  }'
它输出:

{
  "tokens" : [
    {
      "token" : "obj_deleted",
      "start_offset" : 0,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
  ]
}
{
“代币”:[
{
“令牌”:“obj_已删除”,
“起始偏移量”:0,
“端部偏移”:11,

“类型”:“字段具有名称为
关键字
的附加映射,该映射具有类型。
关键字
字段不进行分析(仅在需要时可对其进行标准化)。这意味着对于默认映射,它保存传递给
ElasticSearch
的确切值(在您的情况下,
OBJ_已删除
).

您应该避免对
文本
字段使用
术语
查询(请参阅)。默认情况下,Elasticsearch会在分析过程中更改文本字段的值。例如,默认情况下会更改文本字段值,如下所示:

  • 删除大多数标点符号
  • 将剩余内容划分为单独的单词,称为
  • 将标记小写

您可以使用从索引中的适当字段生成正确且可搜索的
术语
。Elasticsearch提供了多种方法。

您使用哪种分析器?哪种分析器是什么意思?我安装了股票Elasticsearch,附带了默认值。我的数据没有映射/模式还有。只需插入一个简单的Json,并尝试在Json.elem上使用查询项queryTry运行
{“object\u status.keyword”:“OBJ\u DELETED”}
进行查询,然后告诉我它是否有效。@rkm是的。成功了!!不过我仍在尝试理解逻辑