布尔查询中 Elasticsearch 中术语和匹配项之间的区别

Diference between term and match in Elasticsearch in a bool query

我有一个简单的文档,其中 _source 看起来像:

{
    "name" : "myProduct",
    "label" : "isApiisApi",
    "isApi" : 1,
    "sold" : 0
}

我一直在尝试使用 bool 创建多条件查询。我让它工作的唯一方法是使用匹配查询:

{
  "query": {
    "bool": {
      "must": [
        { "term": { "sold": 0 } },
        { "term": { "isApi": 1 } },
        { "match": { "name": "myProduct" } }
      ]
    }
  }
}

但为什么当我使用术语查询(作为最终条件)时它不起作用:

{
  "query": {
    "bool": {
      "must": [
        { "term": { "sold": 0 } },
        { "term": { "isApi": 1 } },
        { "term": { "name": "myProduct" } }
      ]
    }
  }
}

Tldr;

弹性 text fields upon ingestion passes the data into a analyzer.

默认 standard analyzer is used. Which comes with a token filter named Lowercase.

您的文本以小写形式编入索引。

但是您正在使用 term 搜索索引数据的精确匹配。

你的情况 myproduct =/= myProduct.

复制

默认弹性索引,两个字段中的所有字符串类数据。

  • text
  • keyword

对于完全匹配,您要使用关键字版本。

见下文:

POST /72020272/_doc
{
    "name" : "myProduct",
    "label" : "isApiisApi",
    "isApi" : 1,
    "sold" : 0
}

GET /72020272/_mapping

GET /72020272/_search
{
  "query": {
    "bool": {
      "must": [
        { "term": { "sold": 0 } },
        { "term": { "isApi": 1 } },
        { "term": { "name": "myProduct" } }
      ]
    }
  }
}

GET /72020272/_search
{
  "query": {
    "bool": {
      "must": [
        { "term": { "sold": 0 } },
        { "term": { "isApi": 1 } },
        { "term": { "name.keyword": "myProduct" } }
      ]
    }
  }
}