最近用到elasticsearch作为知识库底层搜索引擎,开发反馈中文查询有问题,所以引用ik分词解决此问题。
一、安装
根据自己的版本找到github仓库下载,我此处使用为7.9.3版本
v7.9.3 · Releases · medcl/elasticsearch-analysis-ik · GitHub
解压到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
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 语法。因此,在实际使用中,需要根据具体的查询需求和性能要求选择合适的查询语句。