条件查询
- 单条件查询
- match
- debug 查看分词结果
- match_phrase
- 多条件查询
- bool 子元素区别
单条件查询
match
match 匹配字段,会对条件分词,然后每个词以or的关系在文档倒排索引内进行查询
GET bank/_search
{
"query": {
"match": {
"address": "244 Columbus Place"
}
}
}
可以看到
上面两条数据的 address 的相同点就是 都有244。
debug 查看分词结果
GET _analyze
{
"text": ["244 Columbus Place"]
}
# res 可以看到,拆分成了 244,columbus,place;
# 实际查询条件为 244 or columbus or place
{
"tokens" : [
{
"token" : "244",
"start_offset" : 0,
"end_offset" : 3,
"type" : "<NUM>",
"position" : 0
},
{
"token" : "columbus",
"start_offset" : 4,
"end_offset" : 12,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "place",
"start_offset" : 13,
"end_offset" : 18,
"type" : "<ALPHANUM>",
"position" : 2
}
]
}
match_phrase
不对条件值分词,直接拿到文档里面找;只要能找到这个完整的关键词就能匹配。
文档字段包含这个词就能匹配
GET bank/_search
{
"query": {
"match_phrase": {
"address": "244 Columbus Place"
}
}
}
# 可以看到,只查询到一条数据
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 14.199377,
"hits" : [
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "0",
"_score" : 14.199377,
"_source" : {
"account_number" : 0,
"balance" : 16623,
"firstname" : "Bradshaw",
"lastname" : "Mckenzie",
"age" : 29,
"gender" : "F",
"address" : "244 Columbus Place",
"employer" : "Euron",
"email" : "bradshawmckenzie@euron.com",
"city" : "Hobucken",
"state" : "CO"
}
}
]
}
}
多条件查询
在实际使用中,往往是在多个条件下查询数据。
在 query 下使用 bool 聚合多条件。
以下查询条件为:
- address 分词匹配 244 Columbus Plac 且 age = 29
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"address": "244 Columbus Place"
}
},
{
"match": {
"age": 29
}
}
]
}
}
}
bool 子元素区别
- must: 与 (肯定条件)
- must_not:非(否定条件)
- should:或 (or条件)
- filter 过滤器,单纯过滤,先于 上述条件执行,不进行相关性评分,不影响整体评分,会使用过滤器缓存。速度更快。
每个元素内部,还可以嵌套复杂条件(再来一层bool)