elasticsearch 基础 —— Query String

使用查询解析器来解析其内容的查询。下面是一个例子:

GET /_search
{
    "query": {
        "query_string" : {
            "default_field" : "content",
            "query" : "this AND that OR thus"
        }
    }
}

query_string查询解析输入并在运算符周围分割文本。每个文本部分彼此独立地分析。例如以下查询:

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

将分成new york city 或 big apple,然后通过为该字段配置的分析器独立地分析每个部分。

空格不被视为运算符,这意味着new york city将“按原样”传递给为该字段配置的分析器。如果该字段是关键字字段,则分析器将创建单个术语new york city,并且查询构建器将在查询中使用此术语。如果要分别查询每个术语,则需要在术语周围添加显式运算符(例如new AND york AND city)

当提供多个字段时,也可以修改如何使用类型参数在每个文本部分内组合不同字段查询。这里描述了可能的模式,默认是Bestfield。query_string顶级参数包括: 

参数 描述

query

要解析的实际查询。参见查询字符串语法。

default_field

如果未指定前缀字段,则查询字词的默认字段。默认为index.query.default_field索引设置,而索引设置默认为*.*提取映射中符合术语查询条件的所有字段,并过滤元数据字段。然后组合所有提取的字段以在没有提供前缀字段时构建查询。

default_operator

如果未指定显式运算符,则使用默认运算符。例如,使用默认运算符OR,查询 capital of Hungary将转换为capital OR of OR Hungary,并且使用默认运算符AND,将相同的查询转换为capital AND of AND Hungary。默认值为OR

analyzer

用于分析查询字符串的分析器名称。

quote_analyzer

分析器的名称,用于分析查询字符串中的引用短语。对于这些部件,它将覆盖使用analyzer参数或 search_quote_analyzer设置设置的其他分析器。

allow_leading_wildcard

设置时,*?允许作为第一个字符。默认为true

enable_position_increments

设置为true在结果查询中启用位置增量。默认为true

fuzzy_max_expansions

控制模糊查询将扩展到的术语数。默认为50

fuzziness

设置模糊查询的模糊性。默认为AUTO。请参阅允许设置的模糊性编辑。

fuzzy_prefix_length

设置模糊查询的前缀长度。默认是0

fuzzy_transpositions

设置为false禁用模糊转置(ab→ ba)。默认是true

phrase_slop

设置短语的默认斜率。如果为零,则需要精确的短语匹配。默认值是0

boost

设置查询的提升值。默认为1.0

auto_generate_phrase_queries

默认为false

analyze_wildcard

默认情况下,不分析查询字符串中的通配符。通过将此值设置为true,将尽最大努力分析这些值。

max_determinized_states

限制允许创建的regexp查询的自动机状态数。这可以防止太难(例如指数级硬)的regexp。默认为10000。

minimum_should_match

一个值,用于控制生成的布尔查询中应该匹配的“should”子句的数量。它可以是绝对值(2),百分比(30%)或两者的 组合。

lenient

如果设置为true将导致基于格式的失败(如向数字字段提供文本)将被忽略。

time_zone

时区应用于与日期相关的任何范围查询。另见 JODA时区。

quote_field_suffix

附加到查询字符串的引用部分的字段的后缀。这允许使用具有不同分析链的字段进行精确匹配。看看这里为一个完整的例子。

auto_generate_synonyms_phrase_query

是否应为多项同义词自动生成短语查询。默认为true

all_fields

6.0.0 ] 在6.0.0中已弃用。设置default_field*代替执行上可以查询映射检测到的所有字段的查询。_all禁用该字段时将默认使用,并且未default_field指定no (在索引设置或请求正文中)并且未fields指定no 。

在生成多项查询时,可以使用rewrite 参数控制如何重写它 。

Default Field

如果未在查询字符串语法中明确指定要搜索的字段,index.query.default_field则将使用该字段来派生要搜索的字段。如果index.query.default_field未指定,query_string则将自动尝试确定索引映射中可查询的现有字段,并对这些字段执行搜索。请注意,这不包括嵌套文档,使用嵌套查询来搜索这些文档。

Multi Field

query_string查询还可以运行针对多个领域。可以通过"fields"参数提供字段(示例如下)。

field1:query_term OR field2:query_term | ...

query_string针对多个字段运行查询的想法是将每个查询字词扩展为OR子句,如下所示:

例如,以下查询

GET /_search
{
    "query": {
        "query_string" : {
            "fields" : ["content", "name"],
            "query" : "this AND that"
        }
    }
}

匹配相同的单词

GET /_search
{
    "query": {
        "query_string": {
            "query": "(content:this OR name:this) AND (content:that OR name:that)"
        }
    }
}

由于从单个搜索项生成了多个查询,因此使用dis_max带有tie_breaker 的查询自动组合它们。例如(name使用^5符号表示增强5 ):

GET /_search
{
    "query": {
        "query_string" : {
            "fields" : ["content", "name^5"],
            "query" : "this AND that OR thus",
            "tie_breaker" : 0
        }
    }
}

简单通配符也可用于搜索文档的特定内部元素“内”。例如,如果我们有一个city包含多个字段(或带有字段的内部对象)的对象,我们可以自动搜索所有“城市”字段:

GET /_search
{
    "query": {
        "query_string" : {
            "fields" : ["city.*"],
            "query" : "this AND that OR thus"
        }
    }
}

另一种选择是在查询字符串本身中提供通配符字段搜索(正确转义*符号),例如 city.\*:something

GET /_search
{
    "query": {
        "query_string" : {
            "query" : "city.\\*:(this AND that OR thus)"
        }
    }
}

由于\(反斜杠)是json字符串中的特殊字符,因此需要对其进行转义,因此上面的两个反斜杠query_string

query_string对多个字段运行查询时,允许使用以下附加参数:

参数 描述

type

应如何组合字段以构建文本查询。有关完整示例,请参阅类型。默认为best_fields

参数 描述

tie_breaker

用于多场的分离最大连接断路器。默认为0

 fields参数还可以包括基于通配符字段名称,允许自动扩展到相关字段(包括动态引入的字段)。例如:

GET /_search
{
    "query": {
        "query_string" : {
            "fields" : ["content", "name.*^5"],
            "query" : "this AND that OR thus"
        }
    }
}

Synonyms 同义词

query_string查询支持使用synonym_graph标记过滤器进行多项同义词扩展。使用此过滤器时,解析器会为每个多项同义词创建一个短语查询。例如,以下同义词:"ny, new york" would produce:(ny OR ("new york"))也可以将多项同义词与连词相匹配:

GET /_search
{
   "query": {
       "query_string" : {
           "default_field": "title",
           "query" : "ny city",
           "auto_generate_synonyms_phrase_query" : false
       }
   }
}

上面的例子创建了一个布尔查询:

(ny OR (new AND york)) city)

将文档与术语ny或连词匹配new AND york。默认情况下,参数auto_generate_synonyms_phrase_query设置为true

Query string syntax

查询字符串“迷你语言”由 查询字符串查询和API中的 q查询字符串参数search使用。

查询字符串被解析为一系列术语运算符。术语可以是单个单词 -  quickbrown - 或短语,由双引号括起来 -  "quick brown" 以相同的顺序搜索短语中的所有单词。

操作员允许您自定义搜索 - 可用选项如下所述。

Field names

如查询字符串查询中所述default_field,搜索搜索词,但可以在查询语法中指定其他字段:

  • 其中status字段包含active

    status:active
  • 其中title字段包含quickbrown。如果省略OR运算符,将使用默认运算符

    title:(quick OR brown)
    title:(quick brown)
  • 其中author字段包含精确短语"john smith"

    author:"John Smith"
    
  • 其中任何字段book.titlebook.contentbook.date包含 quickbrown(注意我们需要如何*使用反斜杠转义):

    book.\*:(quick brown)
    
  • 该字段title具有任何非null值:

    _exists_:title
    

Wildcards 通配符

通配符搜索可以在单个术语上运行,使用?替换单个字符,并*替换零个或多个字符:

qu?ck bro *

请注意,通配符查询可能使用大量的内存,并且执行得很糟糕,只要想想需要查询多少项来匹配查询字符串“a*b*c*”。

纯通配符\*被重写为exists查询效率。因此,通配符"field:*"将匹配具有空值的文档,如下所示:````{“field”:“”}```... 如果字段丢失或使用显式空值设置则不匹配如下所示:```{`field“:null}```

允许在单词的开头(例如"*ing")使用通配符特别重,因为需要检查索引中的所有术语,以防它们匹配。可以通过设置allow_leading_wildcard为禁用前导通配符 false

Regular expressions 正则表达式

正则表达式模式可以通过将它们包装在forward-slashes("/")中嵌入查询字符串中:

name:/joh?n(ath[oa]n)/

正则表达式语法中解释了受支持的正则表达式语法。

allow_leading_wildcard参数对正则表达式没有任何控制权。如下所示的查询字符串将强制Elasticsearch访问索引中的每个术语:/.*n/ 谨慎使用!

Fuzziness 模糊

我们可以使用“fuzzy”运算符搜索与我们的搜索字词类似但不完全相同的字词:

quikc~ brwn~ foks~

它使用 Damerau-Levenshtein distance 来查找最多有两个变化的所有术语,其中一个变化是插入、删除或替换单个字符,或替换两个相邻字符。

默认编辑距离为2,但是编辑距离为1应该足以捕捉所有人类拼写错误的80%。它可以被指定为:

quikc~1

Proximity searches 邻近搜索

虽然短语查询(例如"john smith")期望所有术语具有完全相同的顺序,但是邻近查询允许指定的单词更远或者以不同的顺序。与模糊查询可以为单词中的字符指定最大编辑距离的方式相同,邻近搜索允许我们指定短语中单词的最大编辑距离:

"fox quick"~5

字段中的文本越接近查询字符串中指定的原始顺序,该文档被认为越相关。与上面的示例查询相比,该短语"quick fox"将被视为更相关"quick brown fox"

Ranges 范围

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

  • All days in 2012:

    date:[2012-01-01 TO 2012-12-31]
  • Numbers 1..5

    count:[1 TO 5]
  • Tags between alpha and omega, excluding alpha and omega:

    tag:{alpha TO omega}
  • Numbers from 10 upwards

    count:[10 TO *]
  • Dates before 2012

    date:{* TO 2012-01-01}

可以组合使用大括号和方括号:

  • 数字从1到5但不包括5

count:[1 TO 5}

一边无范围的范围可以使用以下语法:

age:>10
age:>=10
age:<10
age:<=10

要将上限和下限与简化语法结合使用,您需要将两个子句与AND运算符连接:

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

查询字符串中的范围解析可能很复杂且容易出错。使用显式range查询更加可靠。

Boosting 提升权重

使用boost运算符^使一个术语比另一个术语更相关。例如,如果我们想要找到关于foxes的所有文档,但我们对quick foxes特别感兴趣:

quick^2 fox

默认boost值为1,但可以是任何正浮点数。0到1之间的提升会降低相关性。

提升也可以应用于短语或群组:

"john smith"^2   (foo bar)^4

Boolean operators 布尔运算符

默认情况下,只要一个术语匹配,所有术语都是可选的。搜索foo bar baz将查找包含一个或多个foobar或的任何文档 baz。我们已经讨论了default_operator 上面的内容,它允许你强制要求所有的术语,但也有一些布尔运算符可以在查询字符串本身中使用,以提供更多的控制。

首选运算符+(此术语必须存在)和- (此术语不得出现)。所有其他条款都是可选的。例如,这个查询:

quick brown +fox -news

说明:

  • fox 必须存在
  • news 一定不能存在
  • quickbrown是可选的 - 它们的存在增加了相关性

熟悉的布尔运算符ANDOR以及NOT(也写作&&|| 和!)也支持,但要小心,他们不遵守通常的优先级规则,所以每当多个运营商一起使用时,应使用括号。例如,以前的查询可以重写为:

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

此表单现在可以正确复制原始查询中的逻辑,但相关性评分与原始查询几乎没有相似之处。

相反,使用查询重写的相同match查询 将如下所示:

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

Grouping 分组

可以将多个术语或子句与括号组合在一起,以形成子查询:

(quick OR brown) AND fox

组可用于定位特定字段,或用于提升子查询的结果:

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

Reserved characters 保留字符

如果你需要在查询本身中使用任何作为运算符的字符(而不是运算符),那么你应该使用前导反斜杠来转义它们。例如,要搜索(1+1)=2,您需要将查询编写为\(1\+1\)\=2

保留的字符是: + - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /

无法正确转义这些特殊字符可能会导致语法错误,从而阻止您的查询运行。

根本无法转义。 阻止它们尝试创建范围查询的唯一方法是完全从查询字符串中删除它们。

Empty Query 空查询

如果查询字符串为空或仅包含空格,则查询将生成空结果集。

 

你可能感兴趣的:(ELK)