在 es 里有两种存储字符串的字段类型,一个是 keyword,一个是 text。
keyword 在存储数据的时候是作为一个整体存储的,不会对其进行分词处理
text 存储数据的时候会对字符串进行分词处理,然后存储。
type为keyword的字段,检索时检索词不会被分词,存入es时也不会被分词,所以哪怕使用的是match查询,检索时检索词不会被分词。
可以通过_anlyze接口分析字段在建立倒排索引时的分词情况
GET zl_file_task/_analyze
{
"text":"解析成功",
"field": "status"
}
结果:
{
"tokens" : [
{
"token" : "解",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "析",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "成",
"start_offset" : 2,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 2
},
{
"token" : "功",
"start_offset" : 3,
"end_offset" : 4,
"type" : "<IDEOGRAPHIC>",
"position" : 3
}
]
}
1. math查询(分词匹配查询)
match查询是按ES分词的倒排表进行查询,而keyword不会被分词,match的需要跟keyword的完全匹配可以。可以用于一般性的匹配查询。
1.1 match_all
match_all可以用于查询全部信息。
1.2 match
mathc是单个字段进行分词匹配查询。
1.3 multi_match
multi_match是多字段进行匹配查询。
GET zl_file_task/_search
{
"query":{
"multi_match":{
"query":"解析成功",
"fields":["status","content"]
}
}
}
结果中只要status或者content中有一个满足条件即可
1.4 match_phrase
在执行短语匹配查询时,ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,使用这个方法不加其他参数的情况下,可以看作是会匹配包含这个短语、且顺序一致的数据。如“解析成功”存放时会被分为“解”、“析”、“成”、“功”四个词,若查询“解析”、“析成”则可以匹配成功,但若查询“析解”、“解成”则匹配失败
但是 match_phrase 有一个 slop 参数可以用于忽略这种顺序,也就是允许搜索的关键词错位的个数。
2. term查询
term是ES中的精准查询,不会参与ES分词查询。
核心点:检索词不会被分词,作为一个Token/term
term查询时,检索词不会分词,将检索词与所查字段的分词进行比对,满足要求时即可返回。
在对于搜索的 text 字段后加上
.keyword
字段的操作,可以理解成是使用 term 来搜索 keyword 字段。
3. fuzzy查询(模糊查询)
fuzzy查询可以用于纠正去拼写的问题。
fuzziness是可以允许纠正错误拼写的个数
GET zl_file_task/_search
{
"query":{
"fuzzy": {
"status": {
"value": "你",
"fuzziness": 1
}
}
}
}
只查询一个词,允许拼写错一个,即查询全部
4. wildcard(通配符查询)
通配符查询允许我们指定一个模式来匹配,而不需要指定完整的trem,匹配的方式类似于match的分词匹配查询。
?将会匹配如何字符;*将会匹配零个或者多个字符。
GET zl_file_task/_search
{
"query":{
"wildcard": {
"status": "*解"
}
}
}
5. bool查询(布尔查询)
bool查询本身没有查询功能,而是基于逻辑值使用前面几种查询方式进行组合查询。
2.1 should查询
GET zl_file_task/_search
{
"query":{
"bool": {
"should": [
{},
{}
]
}
}
}
2.2 must查询
GET zl_file_task/_search
{
"query":{
"bool": {
"must": [
{},
{}
]
}
}
}
6.取特定字段
GET zl_file_task/_search
{
"_source": ["task_name","status"],
"query": {
"match": {
"status.keyword": "解析成功"
}
}
}
}