1、版本问题
Elasticsearch的最新版本已经到7.4.0,但很多人可能是像我一样的初学者,没有经历过版本的演化升级过程,因此也就不知道不同版本之间的变动和差异。
当我们开始实操的时候,大多也是跟着网上的一些资料进行学习,而这些资料很多都是基于某个版本的,而问题就在于初学者并不知道全貌,也不知道不同版本具体有哪些差异,我们通过零散的知识去构建索引,进行数据查询的时候就会遇到很多令人困惑的问题。
- 复杂搜索 filtered-bool
权威指南上的例子
GET /megacorp/employee/_search
{
"query" : {
"filtered" : {
"filter" : {
"range" : {
"age" : { "gt" : 30 }
}
},
"query" : {
"match" : {
"last_name" : "smith"
}
}
}
}
}
在elasticSearch客户端上执行时报错(我的Elasticsearch版本为6.8.1)
错误如下:
{
"error": {
"root_cause": [
{
"type": "parsing_exception",
"reason": "no [query] registered for [filtered]",
"line": 3,
"col": 22
}
],
"type": "parsing_exception",
"reason": "no [query] registered for [filtered]",
"line": 3,
"col": 22
},
"status": 400
}
原因: no [query] registered for [filtered] filtered过滤查询已被弃用,并在ES 5.0中删除。
替代方案: 使用bool / filter/ must查询
GET /megacorp/employee/_search
{
"query" : {
"bool" : {
"filter" : {
"range" : {
"age" : { "gt" : 30 }
}
},
"must": {
"match" : {
"last_name" : "smith"
}
}
}
}
}
- 字段索引类型
在很多文章中看到类似下面的描述
type
: 指定字段类型, 如:text
,long
,double
和date
.
index
: 指定字段索引的类型:
no
: 不可被搜索
not_analyzed
: 必须精确匹配,不分词
analyzed
: 使用分析器建立倒排索引
在另一些文章中又会看到
index只有两个取值,分别是true或false,用来表示字段是否可以被搜索,而用"type" : "keyword"表示精确搜索,不为字段建立分词
产生困惑的原因就是觉得都是配置index,怎么有的文章是第一种写法,有的是第二种写法,而且代表的含义也不太相同。查阅资料后才知道,这是不同版本的写法,后者是5.0之后的写法。其他网友的举的栗子:
PUT /my_store {"mappings" : {"products" : {"properties" : {"productID" : {"type" : "string","index" : "not_analyzed"}}}}}
但是这是es5.0以前的设置方法,在5.0以后,string类型的not_analyzed被keyword类型代替了,也就是说,设置方法如下:
PUT /my_store {"mappings" : {"products" : {"properties" : {"productID" : {"type" : "keyword"}}}}}
总结:对于初学者在不同的地方看到这些描述就会产生困惑,如果这些文章能够有基于的版本(尤其是针对版本升级后的文章)就更好了。但解决这种问题的根本方法还是要系统的学习并实践。