【问题标题】:Elasticsearch match vs. term in filterElasticsearch 匹配与过滤器中的术语
【发布时间】:2020-07-07 02:02:22
【问题描述】:

我没有看到过滤器中的 term 和 match 之间有任何区别:

POST /admin/_search
{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "partnumber": "j1knd"
                    }
                }
            ]
        }
    }
}

结果也包含不完全匹配的零件号,例如:“52527.J1KND-H”

为什么?

【问题讨论】:

  • 感谢您的支持和接受,很高兴它有帮助:-)

标签: elasticsearch elasticsearch-query term-query


【解决方案1】:

术语查询不会被分析,并且意味着您发送的任何内容都将按原样匹配倒排索引中的标记,而匹配查询会被分析并应用于字段的相同分析器,该分析器在索引时使用,因此匹配文档。

阅读有关term querymatch query 的更多信息。如匹配查询中所述:

返回与提供的文本、数字、日期或布尔值匹配的文档 价值。在匹配之前分析提供的文本。

您还可以使用analyze API 查看为特定字段生成的令牌。

standard analyzer52527.J1KND-H 文本上生成的令牌。

POST /_analyze
{
    "text": "52527.J1KND-H",
    "analyzer" : "standard"
}

{
    "tokens": [
        {
            "token": "52527",
            "start_offset": 0,
            "end_offset": 5,
            "type": "<NUM>",
            "position": 0
        },
        {
            "token": "j1knd",
            "start_offset": 6,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "h",
            "start_offset": 12,
            "end_offset": 13,
            "type": "<ALPHANUM>",
            "position": 2
        }
    ]
}

上面向您解释了为什么您也得到不完全匹配的partnumbers,例如:“52527.J1KND-H”,我会以您的示例以及如何使其工作。

索引映射

{
  "mappings": {
    "properties": {
      "partnumber": {
        "type": "text",
        "fields": {
          "raw": { 
            "type":  "keyword" --> note this
          }
        }
      }
    }
  }
}

索引文档

{
  "partnumber" : "j1knd"
}

{
  "partnumber" : "52527.J1KND-H"
}

搜索查询只返回完全匹配

{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "partnumber.raw": "j1knd" --> note `.raw` in field
                    }
                }
            ]
        }
    }

结果

 "hits": [
      {
        "_index": "so_match_term",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.0,
        "_source": {
          "partnumber": "j1knd"
        }
      }
    ]

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2013-11-13
    相关资源
    最近更新 更多