elasticsearch中TermQuery查不到数据是啥问题?
//这边缺查询不到数据为啥?
POST /users/_search
{
"query": {
"match": {
"firstName":"Ruan"
}
}
}
es执行如下命令:
```
//建立mapping关系
PUT users
{
"mappings" : {
"properties" : {
"firstName" : {
"type" : "text"
},
"lastName" : {
"type" : "text"
},
"mobile" : {
"type" : "text",
"index": false
}
}
}
}
//插入数据
PUT users/_doc/1
{
"firstName":"Ruan",
"lastName": "Yiming",
"mobile": "12345678"
}
//这边缺查询不到数据为啥?
POST /users/_search
{
"query": {
"match": {
"firstName":"Ruan"
}
}
}
```
1 个回答
谎言不会伤人,真相才是快刀。华仔索引mapping建立的不对,应该是"firstName" : {"type" : "keyword"}, keyword才能用term。text的精确匹配请用match_phrase 使用如下命令: ``` POST /users/_search { "query": { "match_phrase": { "firstName":"Ruan yy" } } } ``` 原因: term做精确查询可以用它来处理数字,布尔值,日期以及文本。查询数字时问题不大,但是当查询字符串时会有问题。term查询的含义是termQuery会去倒排索引中寻找确切的term,但是它并不知道分词器的存在。term表示查询字段里含有某个关键词的文档,terms表示查询字段里含有多个关键词的文档。也就是说直接对字段进行term本质上还是模糊查询,只不过不会对搜索的输入字符串进行分词处理罢了。如果想通过term查到数据,那么term查询的字段在索引库中就必须有与term查询条件相同的索引词,否则无法查询到结果。 一句话解释: elasticsearch 里默认的IK分词器是会将每一个中文都进行了分词的切割,所以你直接想查一整个词,或者一整句话是无返回结果的。 在elastic权威指南一书中是这样给出建议的:"匹配查询 match 是个 核心 查询。无论需要查询什么字段, match 查询都应该会是首选的查询方式。它是一个高级 全文查询 ,这表示它既能处理全文字段,又能处理精确字段。"这就意味着match查询是高级查询,底层使用了term查询。 结论:相关度查询使用match,精确字段查询使用matchPhrase即可。编辑于 2021-05-25 21:22 •IP属地 浙江举报评论收藏
公众号进入网站体验更佳

