full text查询就是基于分词的查询,有很多分类
intervals query intervals查询: 全文查询,可以对匹配项的顺序和接近度进行细粒度控制。
match query匹配查询: 用于执行全文查询的标准查询,包括模糊匹配和短语或接近查询。
match_bool_prefix查询: 创建一个布尔查询,将与每个词匹配的词查询作为词查询,但最后一个词除外,后者作为前缀查询匹配
match_phrase查询: 类似于匹配查询,但用于匹配精确短语或单词接近匹配。
match_phrase_prefix查询: 类似于match_phrase查询,但是对最后一个单词进行通配符搜索。
multi_match query多重匹配查询: 匹配查询的多字段版本。
common terms query 常用词查询: 一个更专业的查询,它对不常见的单词给予更多的偏爱。
query_string查询: 支持紧凑的Lucene查询字符串语法,允许您在单个查询字符串中指定AND | OR | NOT条件和多字段搜索。仅限于专业用户。
simple_query_string查询: 适用于直接向用户公开的query_string语法的更简单,更可靠的版本。
1. intervals query 简介
根据匹配项的顺序和接近程度返回文档。
intervals查询使用匹配规则,该规则由一小组定义构成。然后将这些规则应用于指定字段中的term。
这些定义产生的最小intervals序列跨越了文本主体中的各个术语。这些intervals可以由父源进一步组合和过滤。
2. 样例
下面的查询会返回有"my favorite food hot water"或者"my favorite food cold porridge " 的docment
但是"when it’s cold my favorite food is porridge" 的doc则不会被召回
PUT interval/_doc/1
{
"my_text" : "my favorite food hot water"
}
PUT interval/_doc/2
{
"my_text" : "my favorite food cold porridge"
}
PUT interval/_doc/3
{
"my_text":"when it’s cold my favorite food is porridge"
}
POST _search
{
"query": {
"intervals" : {
"my_text" : { # 这里是你要进行interval query的field
"all_of" : {
"ordered" : true,
"intervals" : [
{
"match" : {
"query" : "my favorite food",
"max_gaps" : 0,
"ordered" : true
}
},
{
"any_of" : {
"intervals" : [
{ "match" : { "query" : "hot water" } },
{ "match" : { "query" : "cold porridge" } }
]
}
}
]
}
}
}
}
}
上面的my_text对应的是一个field的name,然后my_text的value就是一个查询rule object,
这个rule object一共可以有四种类型
match
all_of
any_of
filter
3. match
match rule object的参数
query: (必需,字符串)希望在提供的中找到的文本。
max_gaps: (可选,整数)匹配项之间的最大位置数。除此以外的术语不视为匹配项。默认为-1。如果未指定或设置为-1,则对匹配没有宽度限制。如果设置为0,则这些术语必须彼此相邻。
ordered:(可选,布尔值)如果为true,则匹配词必须以其指定顺序出现。默认为false。
analyzer: (可选,字符串)分析器,用于分析查询中的术语。默认为顶级的分析器。
filter: (可选,intervals过滤器规则对象)可选intervals过滤器。
use_field: (可选,字符串)如果指定,则匹配该字段而不是顶级的intervals。使用该字段中的搜索分析器分析术语。这样,您就可以跨多个字段进行搜索,就好像它们都是同一字段一样。例如,您可以将相同的文本编入词干和未词干字段中,并在未词干的字段附近搜索词干标记。
4. all_of
all_of规则返回匹配其他规则组合的匹配项。
intervals:(必需,规则对象数组)要组合的规则数组。所有规则都必须在文档中产生匹配项,以使整个源匹配。
max_gaps: (可选,整数)匹配项之间的最大位置数。由规则产生的intervals比此intervals更远将不视为匹配。默认为-1。如果未指定或设置为-1,则对匹配没有宽度限制。如果设置为0,则这些术语必须彼此相邻。
ordered: (可选,布尔值)如果为true,则规则所产生的intervals应按其指定的顺序显示。默认为false。
filter: (可选,intervals过滤器规则对象)用于过滤返回的intervals的规则。
5. any_of
any_of规则返回其任何子规则产生的interval。
intervals:(必需,规则对象数组)要匹配的规则数组。
filter: (可选,intervals过滤器规则对象)用于过滤返回的intervals的规则。
6. filter
过滤器规则基于查询返回intervals。有关示例,请参见过滤器示例。
after:(可选,查询对象)查询用于返回遵循过滤规则intervals的intervals。
before: (可选,查询对象)查询用于返回在过滤规则的intervals之前发生的intervals。
contains_by: (可选,查询对象)用于返回过滤规则中某个intervals所包含的intervals的查询。
containing:(可选,查询对象)用于返回包含来自过滤规则的intervals的intervals的查询。
not_contained_by: (可选,查询对象)查询用于返回过滤规则中某个intervals未包含的intervals。
not_contain:(可选,查询对象)用于返回不包含来自过滤规则的intervals的intervals的查询。
not_overlapping: (可选,查询对象)查询用于返回与过滤规则的intervals不重叠的intervals。
overlapping: (可选,查询对象)查询用于返回与过滤规则中的intervals重叠的intervals。
script: (可选,脚本对象)用于返回匹配文档的脚本。该脚本必须返回布尔值true或false。有关示例,请参见脚本过滤器。
样例
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "hot porridge",
"max_gaps" : 10,
"filter" : {
"not_containing" : {
"match" : {
"query" : "salty"
}
}
}
}
}
}
}
}
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "hot porridge",
"filter" : {
"script" : {
"source" : "interval.start > 10 && interval.end < 20 && interval.gaps == 0"
}
}
}
}
}
}
}
intervals查询始终将intervals最小化,以确保查询可以线性运行。有时这可能会导致令人惊讶的结果,尤其是在使用max_gaps限制或过滤器时。例如,采用以下查询,
则拥有"hot porridge is salty porridge" 的字段的doc不会被返回,因为contained_by只会返回他命中的那一部分,在这里,只会命中"hot porridge is salty porridge" 前面两个单词,那么salt就没有办法匹配了
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "salty",
"filter" : {
"contained_by" : {
"match" : {
"query" : "hot porridge"
}
}
}
}
}
}
}
}