03-DSL查询语法-全文检索查询
1.全文检索查询
全文检索查询,会对用户输入内容分词,常用于搜索框搜索:
比如有一个旅游网站,有一个搜索框,在里面可以输入酒店的相关信息,酒店的名称也好,酒店的地理位置也好,点击搜索,他就可以帮你去检索出相关的酒店返回给你。或者是去京东买东西,搜索“西门子冰箱”,这时候点击搜索按钮,我们的京东后台就可以把这个数据得到以后,先对这个内容做分词,然后得到西门子和冰箱两个词,然后拿着这两个词,分别取倒排索引库里面进行检索和匹配,得到相关的文档,也就是商品,然后返回给你。这两种场景都可以用于全文检索。
2.全文检索查询
1.match查询:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:
GET /indexName/_search
{
"query": {
"match": {
"FIELD": "TEXT"
}
}
}
# match查询
GET /hotel/_search
{
"query": {
"match": {
"all": "上海外滩"
}
}
}
FIELD:字段,也就是你要根据哪个字段做查询
TEXT:搜索的内容,比如京东的“西门子冰箱”
2.multi_match:与match查询类似,只不过允许同时查询多个字段,语法:
GET /indexName/_search
{
"query": {
"multi_match": {
"query": "TEXT",
"fields": ["FIELD1", " FIELD12"]
}
}
}
# multi_match查询
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "外滩如家",
"fields": ["brand", "name", "business"]
}
}
}
会发现这两种效果一样,为什么?
因为上面虽然搜的是all这个字段,但是我们是把brand、name、business这三个字段的值拷贝进去了,既然如此,效果肯定就是一样的了。
但是建议用all这种,因为参与搜索的字段越多,将来查询的效率越低。也就是不要根据多个字段去查,而是把多个字段拷到一个字段里面去。
3.总结:
match和multi_match的区别是什么?
match:根据一个字段查询
multi_match:根据多个字段查询,参与查询字段越多,查询性能越差