最近用到elasticsearch作为知识库底层搜索引擎,开发反馈中文查询有问题,所以引用ik分词解决此问题。

一、安装

根据自己的版本找到github仓库下载,我此处使用为7.9.3版本

v7.9.3 · Releases · medcl/elasticsearch-analysis-ik · GitHub

es查询 指定 分词器 es查看分词_大数据

解压到ES的elasticsearch-7.9.3/plugins/ik/目录里,重启es即可。

二、使用

1.新建索引

curl -H 'Content-type: application/json' -XPUT 'http://192.168.113.138:9200/kms_index'

2.设置mapping,指定某些字段的分词器

curl -H 'Content-type: application/json' -XPOST 'http://192.168.113.138:9200/kms_index/_mapping' -d '{
 "properties": {
  "mainContent": {
   "type": "text",
   "analyzer": "ik_smart"
  },
  "title": {
   "type": "text",
   "analyzer": "ik_max_word"
  }
 }
}'

3.导入数据后查看mapping

es查询 指定 分词器 es查看分词_中文分词_02

4.开发查询,大部分中文词组已经可以查询到了。

三、思考 

1.为什么title设置了ik_smart分词,仍然不能单个字查询?

2.为什么类似于日志平台可以查询任意字符串,可以中文+英文的格式?

解决:查看api后发现可以使用query_string的查询方式,可以支持查询大部分数据,但是仍然不能查询单个字。

curl -H 'Content-type: application/json' -XGET 'http://192.168.113.138:9200/kms_index/_search' -d '
{
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "使用sslvpn"
    }
  }
}
'

经过查找文档,整理出query和query_string的区别如下:

在 Elasticsearch 中,query和query_string都是查询语句,但它们的用法和功能不同。

`query` 是 Elasticsearch 的核心查询语言,它是基于 JSON 格式的查询 DSL(Domain-specific language)。使用 `query`,用户可以构建复杂的查询,利用各种查询子句和过滤器来精确地控制搜索结果的匹配度和排序。

`query_string` 查询是一种在查询语句中将查询表达式定义为简单的字符串的方法,它允许用户使用类似于 SQL 的表达式语言来指定单个查询条件。该查询可以包含一个或多个查询条件,以及 AND、OR 和 NOT 运算符,以及括号等逻辑控制符号。

相比而言,`query_string` 较为灵活和容易使用,但由于其具有的通配符和模糊搜索的特性,可能导致较高的查询延迟和资源消耗。而 `query` 的优势在于它具有更高的性能和更精确的搜索控制能力,但需要使用者了解一些复杂的查询 DSL 语法。因此,在实际使用中,需要根据具体的查询需求和性能要求选择合适的查询语句。