当查询文本为字母数字模式时,Elasticsearch返回所有记录

问题描述

我在Elasticsearch中有一个索引,映射为:

/price_validity_idx

{
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
      },"validity":{
        "type": "boolean"
      }
    }
  }
}

该索引中存储的数据如下所示:

{
 "title" : "16 USD product"
"validity": true
}
{
 "title" : "USD 5 refill"
"validity": true
}
.....
{
 "title" : "10 USD"
"validity": false
},{
"title" : "Movies on Demand-Free of cost"
"validity": false
},{
"title" : "One month subscription on Cash purchase"
"validity": true
}

因此,每当我在字段 title 上进行 Match Query (匹配查询)时,查询文本均为字母数字(例如5美元) 所有在 title 中具有数值的记录都将作为结果的一部分返回。

例如,卷曲 -XGET '/ price_validity_idx'-d'{“ query”:{“ match”:{“ title”:“ USD 5” } }}'

输出:(删除Elasticsearch元信息以实现紧凑性

{
 "title" : "16 USD product"
"validity": true
},{
 "title" : "USD 5 refill"
"validity": true
},{
 "title" : "10 USD"
"validity": false
}

但是,只要我在字段 title 上进行相同的 Match Query (匹配查询),只用数字作为查询文本(例如5),就会匹配与返回数字。

当查询文本为字母数字(例如5美元)时,如何只返回与确切数值匹配的记录。由于某些业务限制,我将无法将映射类型更改为 INTEGER 。另外,由于该字段还包含一些冗长的文本数据,因此我将无法使用TERM查询。

由于我是Elasticsearch的新手,请提供帮助。

使用的版本是Elasticsearch-7.8.1

解决方法

标准分析仪是默认分析仪,如果未指定则使用该分析仪。生成的标记是usd5,因此所有与这些标记中的任何一个匹配的文档都将与搜索查询匹配。

分析API

GET/ _analyze
{
  "analyzer" : "standard","text" : "USD 5"
}

会生成以下令牌:

{
  "tokens": [
    {
      "token": "usd","start_offset": 0,"end_offset": 3,"type": "<ALPHANUM>","position": 0
    },{
      "token": "5","start_offset": 4,"end_offset": 5,"type": "<NUM>","position": 1
    }
  ]
}

您可以使用match_phrase query来分析文本并 从分析的文本中创建短语查询。

搜索查询:

{
  "query": {
    "match_phrase": {
      "title": "USD 5"
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "64528215","_type": "_doc","_id": "2","_score": 2.1446278,"_source": {
          "title": "USD 5 refill","validity": true
        }
      }
    ]

编辑1:

您甚至可以将match query与运算符AND一起使用,即 用于解释查询值中文本的布尔逻辑

{
  "query": {
    "match": {
      "title": {
        "query": "USD 5","operator": "and"
      }
    }
  }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...