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 ;