如果按某个字段过滤,ElasticSearch 将返回空命中

问题描述 投票:0回答:1

我是 Elastic Search 的新手,所以任何提示或提示都将不胜感激!

我有一个索引,我想在其中检索一些与“my_id”字段的某些值完全匹配的条目。

这些是我的尝试: 查询1:

{
  "min_score": 1,
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "project": ["one"]
          }
        }
      ],
      "filter": [
        { "terms": { "my_id": ["my_id_2", "my_id_1"] } }
      ]
    } 
  }
}

-> 返回空命中。

查询2:

{
  "min_score": 1,
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "project": ["one"]
          }
        }
      ]
    , "should": [
      {
          "match": {
            "my_id": "my_id_1"
          }
        },
        {
          "match": {
            "my_id": "my_id_2"
          }
        }
      ]
    } 
  }
}

-> 返回比给定 my_id 的条目更多的条目。

我在这里不知所措,看不出有什么问题。我必须看一下分析仪吗?如果是基于文本或关键字的设置?如果是这样,你如何检查这些并更改这些?

预先感谢您的每一个回答和评论!

编辑:

这是字段类型:

        "my_id": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
elasticsearch opensearch elasticsearch-dsl
1个回答
0
投票

在第二个代码片段中:

当你使用“should”和“must”时,当然,你会得到更多结果,因为“should”不一定是true;只需“must”就足以检索数据。例如,当您使用“must project = 'one'”时,这意味着它将使用 project =“one” 获取所有内容,无论“should”中包含什么。 “应该”只会增加额外分数;它不会过滤任何东西。

在第一个代码片段中:

没有任何问题;该查询似乎完全准确。您要做的就是首先匹配所有具有 (project == "one" && (my_id == "my_id_1" || my_id == "my_id_2")) 的数据。这正是正在发生的事情,而且应该有效。如果您没有得到结果,可能是由于以下两个原因之一:删除 "min_score": 1,或者确保数据库中有数据 project = "one"my_id = " my_id_1”或“my_id_2”因为查询必须检索数据,而且分析器没有任何问题。

此外,还有一些我觉得你可能不知道的事情你应该知道:

  1. FilterMust 正在做完全相同的事情,唯一的区别是 filter 不会对结果进行评分。

  2. Should 没有做任何事情,它只是为结果添加额外的分数。这意味着如果您删除 should,结果将是相同的,但只是分数较低。

  3. TermMatch几乎相同,不同的是term是根据精确匹配(“data”==“data”)进行搜索,而match是根据文本分析器进行搜索意思是你可以搜索句子的一部分,(“数据”==“数据库中的数据”)

  4. 查询中的
  5. (AND)、(OR)、(Relationship)逻辑:

我会尽力解释这部分,我会编写代码和查询比较:

第一个例子:

代码:

if(a == 1 && b == 2){ getdata(); }

查询:

"query": {
    "bool": {
      "must": [
        {
          "term": { "a": 1 },
          "term": { "b": 2 }
        }
      ]
    }
 }

意味着 {term},{term} 这个关系是 (AND)

第二个例子:

代码:

if(a == 1 || b == 2){ getdata(); }

查询:

"query": {
    "bool": {
      "must": [
        {
          "terms": { "a": [1,2] }
        }
      ]
    }
 }

意味着 {terms[1,2]} 这个关系是 (OR)

第三个例子:

代码:

Doc dataArray1[];
Doc dataArray2[];

if(a==1) {
  dataArray1 = getdata();
}
if(b==2) {
  dataArray2 = getdata();
}

intersection(dataArray1, dataArray2);

查询:

"query": {
    "bool": {
      "must": [
        {
          "term": { "a": 1 }
        }
      ],
      "filter" : [
        {
          "term": { "b": 2 }
        }
      ]
    }
 }

意味着任何 bool 查询之间的关系都是交集,但我们将排除 should

第四个例子:

代码:

Doc dataArray1[];
Doc dataArray2[];
Doc dataArray3[];
Doc res[];

if(a==1) {
  dataArray1 = getdata();
}
if(b==2) {
  dataArray2 = getdata();
}
if(c==3) {
  dataArray3 = getdata();
}

res = intersection(dataArray1, dataArray2);

for(Doc d : dataArray3) {
  res[d].score++;
}

查询:

"query": {
    "bool": {
      "must": [
        {
          "term": { "a": 1 }
        }
      ],
      "filter" : [
        {
          "term": { "b": 2 }
        }
      ],
      "should" : [
        {
          "term": { "c": 3 }
        }
      ]
    }
 }

意思是应该只是增加一个分数,仅此而已。

代码不是要运行的东西,它只是为了解释每个代码背后的想法或逻辑,Elasticsearch 的后端不一定是这样工作的,我只是举这些例子来演示并使其更容易理解

© www.soinside.com 2019 - 2024. All rights reserved.