query_string参数 之 auto_generate_phrase_queries
,default_operator
默认值导致出现以上问题:
auto_generate_phrase_queries
:是否自动生成短语查询(有可能一条字符串 生成多个短语) 默认值 false;default_operator
:词与词,或短语与短语之间的运算符 (and 或 or) 默认 or
假如有以下三条数据
ID | 标题 |
---|---|
1 | 我想学习elasticsearch |
2 | 什么是elasticsearch |
3 | 我想学习java and elasticsearch |
张三搜索 我想学习elasticsearch
elasticsearch query 为
{
"query": {
"query_string": {
"query": "title:我想学习elasticsearch"
}
}
}
结果会把,ID为1,2,3的都查询出来
原因是query_string 有一个参数 default_operator
默认值为 or
假如分析器把 我想学习elasticsearch
分词为我
, 想
, 学习
, elasticseach
,
那么当 default_operator
值为 or
或不设置时
只要title 里边包含 我
, 想
, 学习
, elasticseach
, 其中一个就会查询出来;
同理当 default_operator
值为 and
时
title 里边必须同时包含 我
, 想
, 学习
, elasticseach
, , 才会查询出来
{
"query": {
"query_string": {
"default_operator":"and",
"query": "title:我想学习elasticsearch"
}
}
}
结果会把ID为1,3的查询出来;
但是张三说 我搜索 我想学习elasticsearch
只想把ID 为 1的搜索出来怎么办呢
两种解决方案:
1: 加双引号("我想学习elasticsearch"
)
{
"query": {
"query_string": {
"default_operator":"and",
"query": "title:\"我想学习elasticsearch\""
}
}
}
2:auto_generate_phrase_queries
设置为 true (即短语搜索)
{
"query": {
"query_string": {
"default_operator":"and",
"auto_generate_phrase_queries":true,
"query": "title:我想学习elasticsearch"
}
}
}
以上两种方法均是通过 短语搜索 实现的 ;我想学习elasticsearch
生成的短语为 我想学习elasticsearch
;
所以title 里边必须按顺序包含 我
, 想
, 学习
, elasticseach
才会查询出来 即ID 为 1 ;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。