文章目录
1.Query string
- 基于提供的查询字符串返回文档,使用一个具有严格语法的解析器
- 这个查询使用一个语法基于操作符(像AND 或 NOT)去解析和分隔提供的查询字符串,然后在返回匹配文档前独立分析每个分隔的文本
- 你可以使用query_string去创建一个包含通配符,跨多个字段搜索的复杂搜索
- 这个查询是严格的,如果查询字符串包含任何无效语法,将会返回错误
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根一级参数
挑几个重要的说
- query
必须字段,搜索你想要解析的字符串 - analyzer
analyzer被用于转换查询字符串变成词条 - default_operator
(1)OR:默认。例如:一个查询字符串capital of Hungary被解释为capital 或 of 或 Hungary
(2)AND:例如:capital of Hungary被解释为capital 且 of 且 Hungary - fields
可选参数。你希望搜索的一个字段数组
1.3 查询字符串语法
- 查询字符串被解析成一系列的分词和操作符,一个分词可以实一个单独的分词-quick or brown;或者一个短语,需要双引号包裹起来-“quick brown”-以相同的顺序搜索所有单词
- 指定要搜索的字段
(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
- 返回文档基于一个提供的查询字符串,使用一个有限但可以容错的语法解析
- 此查询基于特殊的操作符,使用简单的语法去解析和分隔提供的查询字符串成为分词
- 虽然这个语法相比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根一级参数
挑几个说
- query
- fields
- default_operator
(1)OR
(2)AND - analyzer
- minimum_should_match
2.2 Simple query string语法
GET /_search
{
"query": {
"simple_query_string": {
"fields": [ "content" ],
"query": "foo bar -baz"
}
}
}
- 上述查询将返回文档中包含foo或bar或不包含baz的。
- 为了让上述文档按照预期返回,可以将查询字符串改为:
foo bar +-baz