首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当查询文本为字母数字模式时,Elasticsearch返回所有记录

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

Stack Overflow用户
提问于 2020-10-25 20:03:25
回答 1查看 533关注 0票数 1

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

代码语言:javascript
运行
复制
/price_validity_idx

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

存储在这个索引中的数据如下所示:

代码语言:javascript
运行
复制
{
 "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
}

因此,每当我在字段Match Query上使用字母数字(eg.USD 5)的查询文本对标题进行查询时,在标题中具有数值的所有记录都将作为结果的一部分返回。

例如,curl -XGET‘/price_有效性_idx’-d‘{“查询”:{“匹配”:{“标题”:“美元5" }}’

输出:(删除elasticsearch紧致信息)

代码语言:javascript
运行
复制
{
 "title" : "16 USD product"
"validity": true
},
{
 "title" : "USD 5 refill"
"validity": true
},
{
 "title" : "10 USD"
"validity": false
}

但是,每当我在字段title上进行相同的匹配查询时,只将数字作为查询文本(例如5),则返回与数字匹配的特定记录。

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

请帮助我,因为我是新来的Elasticsearch。

使用的版本是Elasticsearch-7.8.1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-26 01:13:41

标准分析器是默认分析器,如果没有指定,则使用该分析器。生成的令牌是usd5,因此所有匹配这些标记的文档都将匹配搜索查询。

分析API

代码语言:javascript
运行
复制
GET/ _analyze
{
  "analyzer" : "standard",
  "text" : "USD 5"
}

生成以下令牌:

代码语言:javascript
运行
复制
{
  "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
    }
  ]
}

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

搜索查询:

代码语言:javascript
运行
复制
{
  "query": {
    "match_phrase": {
      "title": "USD 5"
    }
  }
}

搜索结果:

代码语言:javascript
运行
复制
"hits": [
      {
        "_index": "64528215",
        "_type": "_doc",
        "_id": "2",
        "_score": 2.1446278,
        "_source": {
          "title": "USD 5 refill",
          "validity": true
        }
      }
    ]

编辑1:

您甚至可以将匹配查询与运算符AND一起使用,这是用于解释查询值中文本的布尔逻辑。

代码语言:javascript
运行
复制
{
  "query": {
    "match": {
      "title": {
        "query": "USD 5",
        "operator": "and"
      }
    }
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64528215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档