Es 精确查找的方式
要求:
Es查询:
查询工单信息, 输入 “测试”,查出 form_name 为字段中有查询出有符合内容的数据
term:单字段精确查询:
{
"from": 0,
"size": 20,
"query": {
"bool": {
"should": [{
"term": {
"form_name": "测试"
}
}
]
}
}
}
记录是存在的,但是没有查出来?
为啥呢?
因为form_name 进行了分词。
该如何处理呢?
是否可以让其不分词?语法怎么写? (这个我也不会,貌似一开始插入的时候,就按默认的处理了。无法进行修改了,得删索引,重新建), 有没有简单的方式处理呢?
处理:
加 keyword。因为keyword字段不会进行分词。
"term": {
"form_name.keyword": "测试"
}
查询索引的结构:
GET es_index/_mapping
字符的一般有两种结构:
text 带keyword:
"title" : {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
text:
"title" : {
"type": "text"
}
text:会分词,ES会先把对象进行分词处理,然后再再存入到索引。text就无法使用term查询,可以用match,就无法准确匹配。
keyword:不分词,直接整个存入索引。可以进行完整地查询!默认是256个字符
match_phrase :单字段半精确查询
match_phrase是短语搜索,即它会将给定的短语(phrase)当成一个完整的查询条件。
比如查询 “I will make it”,会当成一个完整的短语进行查询;因为mach_phrase类似like模糊查询,会查出含有该查询条件的内容。因此,如果是查询条件是相对固定的内容,比如状态: 开始,进行,竣工等,就可以用match_phrase
GET /basic_index*/_search
{
"from": 0,
"size": 20,
"query": {
"bool": {
"should": [{
"match_phrase": {
"form_name": "测试"
}
}
]
}
}
}
terms:多字段精确查询:
terms可以指定多字段进行模糊查询。
GET /basic_index*/_search
{
"size": 20,
"from": 0,
"query": {
"bool": {
"should": [{
"terms": {
"form_name": ["测试", "运行", "对比"]
}
}]
}
}
}
记录是存在的,但是没有查出来? 同term的情况,添加keyword 进行处理
总结:
Es精确查询,单个的用term,多个的用terms,注意查询的内容是否分词,分词的添加keyword。如果查询的内容是相对固定的,可以考虑match_phrase进行处理。
关联文章: Es 模糊查找