1. 字符串类型text和keyword的区别
elasticsearch5.x版本的string类型已经不再支持,采用了text和keyword来代替
text字段的数据会被分词建立索引,而keyword是作为整体建立索引。
text字段特点:
- 支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;
- 最大支持的字符长度无限制,适合大字段存储;
使用场景:
- 存储全文搜索数据, 例如: 邮箱内容、地址、代码块、博客文章内容等。
- 默认结合standard analyzer(标准解析器)对文本进行分词、倒排索引。
- 默认结合标准分析器进行词命中、词频相关度打分。
keyword字段特点:
- 不进行分词,直接索引,支持模糊、支持精确匹配,支持聚合、排序操作;
- keyword类型的最大支持的长度为——32766个UTF-8类型的字符,
- 可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果;
使用场景:
- 存储手机号码、主机名、状态码、邮政编码、标签、年龄、性别等数据。
- 用于筛选数据(例如: select * from x where status='open')、排序、聚合(统计)。
- 直接将完整的文本保存到倒排索引中。
在elasticsearch 7.4创建mapping。
PUT my_index
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
}
}
}
}
在之前的版本中,在mappings中再嵌套一层指定类型,比如下面的代码。
PUT my_index
{
"mappings": {
"products": {
"properties": {
"name": {
"type": "keyword"
}
}
}
}
}
这种写法在新版本中,会报错。
2. term查询
term查询时,查询条件中的字符串不会被分词,即使字符串中间有空格分隔,比如"This is a test",也是作为一个整体进行查询。
2.1 term查询keyword字段
term查询条件不分词,keyword字段也不分词,所以需要完全匹配才能查询到。
2.2 term查询text字段
因为text字段会分词,而term不分词,所以term查询的条件必须是text字段分词后的某一个。
3. match查询
match查询时,对查询字符串会进行分词处理。
3.1 match查询keyword字段
match会被分词,而keyword不会被分词,match的分词结果跟keyword的完全匹配可以。
3.2 match查询text字段
match分词,text也分词,只要match的分词结果和text的分词结果有相同的就匹配。
4 match_phrase查询
4.1 match_phrase匹配keyword字段。
match_phrase会被分词,而keyword不会被分词,match_phrase的需要跟keyword的完全匹配才可以。
4.2 match_phrase匹配text字段
match_phrase是分词的,text也是分词的。match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。
5. query_string
这里的参数字符串是一个查询语句。在搜索之前ES会检查查询语句的语法,如果有语法错误会直接报错。
query_string里面还支持更加复杂的写法:
name: acchu nagesh
:查询name
包含acchu
和nagesh
其中的任意一个book.\*:(quick OR brown)
:book
的任何子字段比如book.title
和book.content
,包含quick
或者brown
_exists_: title
:title
字段包含非null
值name: acch*
:通配符,匹配任何acch
开头的字段name:/joh?n(ath[oa]n)/
:正则表达式,需要把内容放到两个斜杠/
中间name: acch~
:模糊匹配,默认编辑距离为2,不过80%的情况编辑距离为1就能解决问题name: acch~1
count:[1 TO 5]
:范围查询,或者count: >10
5.1 query_string查询key字段
query_string查询keyword字段,需要完全匹配才能查询。
5.2 query_string查询text字段。
和match_phrase区别的是,query_string查询text类型字段,不需要连续,顺序还可以调换。