Elasticsearch: Query string与Simple query string

1.Query string

  1. 基于提供的查询字符串返回文档,使用一个具有严格语法的解析器
  2. 这个查询使用一个语法基于操作符(像AND 或 NOT)去解析和分隔提供的查询字符串,然后在返回匹配文档前独立分析每个分隔的文本
  3. 你可以使用query_string去创建一个包含通配符,跨多个字段搜索的复杂搜索
  4. 这个查询是严格的,如果查询字符串包含任何无效语法,将会返回错误
    5. 由于对于无效语法会返回一个错误,所以不推荐在搜索框的场景中使用query_string

1.1 举例

GET /_search
{
  "query": {
    "query_string": {
      "query": "(new york city) OR (big apple)",
      "default_field": "content"
    }
  }
}

上述搜索将运行如下搜索过程:(new york city) OR (big apple) 分隔成两部分new york city和big apple。content字段的analyzer将独立的转换每一部分成为分词,因为这个查询语法没有使用空格作为一个操作符,所以new york city按原样传递给analyzer
即:上述语句将执行,以new york city或big apple为输入的查询字符串,采用content字段的analyzer去搜索文档,默认有点类似match搜索

1.2 query_string根一级参数

挑几个重要的说

  1. query
    必须字段,搜索你想要解析的字符串
  2. analyzer
    analyzer被用于转换查询字符串变成词条
  3. default_operator
    (1)OR:默认。例如:一个查询字符串capital of Hungary被解释为capital 或 of 或 Hungary
    (2)AND:例如:capital of Hungary被解释为capital 且 of 且 Hungary
  4. fields
    可选参数。你希望搜索的一个字段数组

1.3 查询字符串语法

  1. 查询字符串被解析成一系列的分词和操作符,一个分词可以实一个单独的分词-quick or brown;或者一个短语,需要双引号包裹起来-“quick brown”-以相同的顺序搜索所有单词
  2. 指定要搜索的字段

(1)content字段包含city

GET /my-test/_search
{
  "query": {
    "query_string": {
      "query": "content:city"
    }
  }
}

(2)content字段包含city或apple

GET /my-test/_search
{
  "query": {
    "query_string": {
      "query": "content:(city or apple)"
    }
  }
}

(3)content字段包含短语"new york"

GET /my-test/_search
{
  "query": {
    "query_string": {
      "query": "content:\"new york\""
    }
  }
}

(4)content字段不为null

GET /my-test/_search
{
  "query": {
    "query_string": {
      "query": "_exists_:content"
    }
  }
}

1.4 proximity query(临近搜索)

虽然短语查询(用双引号包裹的字符串,例如"john smith")希望所有的分词都以完全相同的顺序排列,但是proximity query允许指定的单词分开更远或者不同的顺序。一个proximity search允许我们去指定一个短语中的最大编辑距离,例如:
“fox quick”~5
字段中的文本越接近查询字符串中指定的原始顺序,该文档被认为越相关。与上市示例相比,"quick fox"比"quick brown fox"更相关

1.5 Range(范围)

可以为日期、数字或字符串字段指定范围。包含范围可以用方括号[min TO max],排除范围可以用大括号{min TO max}

举例:
(1)2012年所有的日期

date:[2012-01-01 TO 2012-12-31]

(2)数字1~5

count:[1 TO 5]

(3)alpha和omega之间的标签,不包括alpha和omega

tag:{alpha TO omega}

(4)10以上的数字

count:[10 TO *]

(5)2012年以前的日期

date:{* TO 2012-01-01}

(6)大括号和方括号组合
数字1~5但是不包括5

count:[1 TO 5}

(7)还有如下用法

age:>10
age:>=10
age:<10
age:<=10
age:(>=10 AND <20)
age:(+>=10 +<20)

1.6 boolean操作符

(1)+ :该分词必须存在
(2)- : 该分词必须不存在
(3)其它的分词是可选的

举例:

quick brown +fox -news
  • fox必须存在
  • news必须不存在
  • quick和brown是可选的,他们的存在将增加相关性

操作符AND, OR 和 NOT(也被写做&& , || ,! )是支持的
所以上述实例也可以写成:

((quick AND fox) OR (brown AND fox) OR fox) AND NOT news

使用matc查询对比一下:

{
    "bool": {
        "must":     { "match": "fox"         },
        "should":   { "match": "quick brown" },
        "must_not": { "match": "news"        }
    }
}

1.7 Grouping(组)

status:(active OR pending) title:(full text search)^2

2. Simple query string

  1. 返回文档基于一个提供的查询字符串,使用一个有限但可以容错的语法解析
  2. 此查询基于特殊的操作符,使用简单的语法去解析和分隔提供的查询字符串成为分词
  3. 虽然这个语法相比query_string是更加具有局限性的,但是simple_query_string对于无效的语法不会返回错误,相反的是,它会忽略查询字符串中任何无效的部分

2.1 举例

GET /_search
{
  "query": {
    "simple_query_string" : {
        "query": "\"fried eggs\" +(eggplant | potato) -frittata",
        "fields": ["title^5", "body"],
        "default_operator": "and"
    }
  }
}

2.1 Simple query string根一级参数

挑几个说

  1. query
  2. fields
  3. default_operator
    (1)OR
    (2)AND
  4. analyzer
  5. minimum_should_match

2.2 Simple query string语法

在这里插入图片描述

GET /_search
{
  "query": {
    "simple_query_string": {
      "fields": [ "content" ],
      "query": "foo bar -baz"
    }
  }
}
  1. 上述查询将返回文档中包含foo或bar或不包含baz的。
  2. 为了让上述文档按照预期返回,可以将查询字符串改为:
foo bar +-baz

猜你喜欢

转载自blog.csdn.net/qq_39198749/article/details/126622736