我在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
}
因此,每当我在字段Match Query上使用字母数字(eg.USD 5)的查询文本对标题进行查询时,在标题中具有数值的所有记录都将作为结果的一部分返回。
例如,curl -XGET‘/price_有效性_idx’-d‘{“查询”:{“匹配”:{“标题”:“美元5" }}’
输出:(删除elasticsearch紧致信息)
{
"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
发布于 2020-10-26 01:13:41
标准分析器是默认分析器,如果没有指定,则使用该分析器。生成的令牌是usd
和5
,因此所有匹配这些标记的文档都将匹配搜索查询。
分析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
}
]
}
您可以使用分析文本并从分析文本中创建短语查询的短语查询。
搜索查询:
{
"query": {
"match_phrase": {
"title": "USD 5"
}
}
}
搜索结果:
"hits": [
{
"_index": "64528215",
"_type": "_doc",
"_id": "2",
"_score": 2.1446278,
"_source": {
"title": "USD 5 refill",
"validity": true
}
}
]
编辑1:
您甚至可以将匹配查询与运算符
AND
一起使用,这是用于解释查询值中文本的布尔逻辑。
{
"query": {
"match": {
"title": {
"query": "USD 5",
"operator": "and"
}
}
}
}
https://stackoverflow.com/questions/64528215
复制相似问题