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

93次阅读

共计 1140 个字符,预计需要花费 3 分钟才能阅读完成。

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 ;

正文完
 0