提示:以下操作均在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
}

运行结果

执行,发现已经可以根据英文或者数字进行模糊查询了。

友情链接:ElasticSearch——全文搜索引擎

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐