提示:以下操作均在kibana7.7.0中操作。
问题描述:
根据es去查询商品的名称,中文查询能查询出数据,但是只输入部分英文或者数字,查询不出数据。
原因分析:
es中的分词器,只将全部的数字和英文做了分词,即将他们看成一个单词,所以,只输入部分英文或者数字时,不存在该部分的分词,估查询不出数据。
举例:
查询名称为 【来自1998年的野狼disco】的商品。
查询1:如果查询 【1998】,可以;
查询2:如果查询 【199】,不行;
查询3:如果查询 【disco】,可以;
查询4:如果查询 【dis】,不行。
解决方案:
1、创建索引
# 创建索引,并设置分词器
PUT /goods_index
{
"settings": {
"index.max_ngram_diff":10,
"analysis": {
"analyzer": {
"my_ngram_analyzer": {
"tokenizer": "my_ngram_tokenizer"
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "ngram",
"min_gram": 1,
"max_gram": 10,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"properties": {
"name":{
"type": "text",
"analyzer": "my_ngram_analyzer"
},
"description":{
"type": "text"
},
"price": {
"type": "double"
},
"createtime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
重点是红色部分,对需要查询的字段设置一个自定义的NGram分词器。
(支持模糊查询数字和英文的关键!)
2、增加文档
# 增加数据
PUT /goods_index/_doc
{
"name" : "来自1998年的野狼disco",
"description" : "暂无描述。。。",
"createtime" : "1998-01-01 23:59:59",
"price": 1.99
}
3、模糊查询
# 模糊查询文档,根据'得分'和创建时间排序,并高亮
GET /goods_index/_search
{
"query": {
"match": {
"name": "199"
}
},
"sort": [
{
"_score": {
"order": "desc"
}
},
{
"createtime": {
"order": "desc"
}
}
],
"highlight": {
"fields": {
"name": {}
}
},
"size": 10000
}
执行,发现已经可以根据英文或者数字进行模糊查询了。文章来源:https://www.toymoban.com/news/detail-525314.html
友情链接:ElasticSearch——全文搜索引擎文章来源地址https://www.toymoban.com/news/detail-525314.html
到了这里,关于ElasticSearch支持根据英文或者数字进行模糊查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!