elasticsearch 使用 query_string 查询 为什么结果跟自己想象的有出入

query_string参数 之 auto_generate_phrase_queriesdefault_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 ;

你可能感兴趣的:(elasticsearch,querystring)