多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 查询语句查询 使用查询解析器为了解析其内容的查询。 这里是一个例子: | `GET /_search` `{` `"query"``: {` `"query_string"` `: {` `"default_field"` `: ``"content"``,` `"query"` `: ``"this AND that OR thus"` `}` `}` `}` | query_string以下几个重要参数: | 参数 | 描述 | | `query` | 要解析的实际查询。 请参阅查询字符串语法。 | | `default_field` | 如果未指定前缀字段,则为查询字词的默认字段。 默认为index.query.default_field索引设置,默认为_all。 | | `default_operator` | 如果未指定显式运算符,则使用默认运算符。 例如,使用OR的默认运算符,匈牙利的查询资本将转换为OR匈牙利的资本OR,如果使用默认运算符AND,则相同的查询将转换为AND匈牙利的资本AND。 默认值为OR。 | | `analyzer` | 用于分析查询字符串的分析器名称。 | | `allow_leading_wildcard` | 设置时,*或? 被允许作为第一个字符。 默认为true。 | | `lowercase_expanded_terms` | 通配符,前缀,模糊和范围查询的条件是否自动降低或不降低(因为它们没有被分析)。 默认为true。 | | `enable_position_increments` | 设置为true可在结果查询中启用位置增量。 默认为true。 | | `fuzzy_max_expansions` | 控制模糊查询将扩展到的术语数。 默认值为50 | | `fuzziness` | 设置模糊查询的模糊性。 默认为AUTO。 有关允许的设置,请参阅“Fuzzinessedit”一节. | | `fuzzy_prefix_length` | 设置模糊查询的前缀长度。 默认值为0。 | | `phrase_slop` | 设置短语的默认斜率。 如果为零,则需要精确的短语匹配。 默认值为0。 | | `boost` | 设置查询的提升值。 默认为1.0。 | | `analyze_wildcard` | 默认情况下,不分析查询字符串中的通配符术语。 将此值设置为true,将尽力分析这些值。 | | `auto_generate_phrase_queries` | 默认False | | `max_determinized_states` | 限制允许创建多少个自动机状态regexp查询。 这防止了太难的(例如指数级的)正则表达式。 默认为10000。 | | `minimum_should_match` | 一个值,用于控制在生成的布尔查询中应该匹配多少个“应该”子句。 它可以是绝对值(2),百分比(30%)或两者的组合。 | | `lenient` | 如果设置为true将导致基于格式的失败(例如向数字字段提供文本)被忽略。 | | `locale` | 应用于字符串转换的区域设置。 默认为ROOT。 | | `time_zone` | 要应用于与日期相关的任何范围查询的时区。 另请参阅JODA时区。 | 当生成多项查询时,可以控制如何使用rewrite参数重写它。 ### 默认字段: 当未在查询字符串语法中显式指定要搜索的字段时,将使用index.query.default_field来导出要搜索的字段。 它默认为_all字段。 因此,如果_all字段被禁用,可能有必要更改它以设置不同的默认字段。 ### 多个字段: query_string查询也可以针对多个字段运行。 字段可以通过“fields”参数提供(如下例所示)。 对多个字段运行query_string查询的想法是将每个查询项扩展为OR子句,如下所示: | `field1:query_term OR field2:query_term | ...` | 例如,以下查询: | `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查询或简单的bool查询自动完成组合。 例如(使用^ 5表示法将名称提升5): | `GET /_search` `{` `"query"``: {` `"query_string"` `: {` `"fields"` `: [``"content"``, ``"name^5"``],` `"query"` `: ``"this AND that OR thus"``,` `"use_dis_max"` `: ``true` `}` `}` `}` | 简单通配符也可以用于搜索文档的“内部”特定内部元素。 例如,如果我们有一个城市对象与多个字段(或内部对象与字段)在其中,我们可以自动搜索所有“城市”字段: | `GET /_search` `{` `"query"``: {` `"query_string"` `: {` `"fields"` `: [``"city.*"``],` `"query"` `: ``"this AND that OR thus"``,` `"use_dis_max"` `: ``true` `}` `}` `}` | 另一个选项是在查询字符串本身中提供通配符字段搜索(正确转义*符号),例如:city。\ *:something。 对多个字段运行query_string查询时,允许以下附加参数: | 参数 | 描述 | | --- | --- | | `use_dis_max` | 应该使用dis_max(设置为true)或bool查询(设置为false)组合查询。 默认为true。 | | `tie_breaker` | 当使用dis_max时,断开最大断路器。 默认值为0。 | fields参数还可以包括基于模式的字段名称,允许自动扩展到相关字段(包括动态引入的字段)。 例如: | `GET /_search` `{` `"query"``: {` `"query_string"` `: {` `"fields"` `: [``"content"``, ``"name.*^5"``],` `"query"` `: ``"this AND that OR thus"``,` `"use_dis_max"` `: ``true` `}` `}` `}` | ## 查询字符串语法 查询字符串“迷你语言”由查询字符串查询和查询API中的q查询字符串参数使用。 查询字符串被解析为一系列的术语和运算符。 术语可以是单个词 - quick 或brown 或一个短语,用双引号括起来 - “quick brown” - 以相同的顺序搜索短语中的所有单词。 操作员允许您自定义搜索 - 可用选项如下所述。 ### 字段名称 如查询字符串查询中所述,搜索default_field是为了搜索搜索词,但可以在查询语法中指定其他字段 如在status字段内包含active | `status:active` | 以下表示标题字段包含快速或棕色。 如果省略OR运算符,将使用默认运算符 | `title:(quick OR brown)` `title:(quick brown)` | 以下表示作者字段包含确切的短语“john smith” | `author:``"John Smith"` | 表示包含任何字段book.title,book.content或book.date包含quick 或brown(注意我们如何需要用反斜杠转义*) | `book.\*:(quick brown)` | 以下表示字段标题具有任何非空值 | `_exists_:title` | ### 通配符 通配符搜索可以使用单个术语运行? 替换单个字符,*替换零个或多个字符: | `qu?ck bro*` | 请注意,通配符查询会使用大量的内存并且执行得效率非常慢 - 只需考虑需要查询多少条件来匹配查询字符串“a * b * c *” 在字的开头允许通配符(例如“* ing”)特别耗性能,因为索引中的所有项都需要检查,以防它们匹配。 可以通过将allow_leading_wildcard设置为false来禁用主导通配符。 默认情况下不会分析通配字词 - 它们是小写的(lowercase_expanded_terms默认为true),但不进行进一步的分析,主要是因为无法准确分析缺少某些字母的单词。 但是,通过将analyze_wildcard设置为true,将尝试在搜索术语列表以匹配术语之前分析通配字。 ### 正则表达式 正则表达式模式可以通过以正斜线(“/”)包裹在查询字符串中来嵌入: | `name:/joh?n(ath[oa]n)/` | 说明了正则表达式语法中受支持的正则表达式语法。 allow_leading_wildcard参数对正则表达式没有任何控制。 诸如以下的查询字符串将强制Elasticsearch访问索引中的每个术语: | `/.*n/` | 要谨慎使用。 ### 模糊性 我们可以使用“fuzzy”运算符搜索与我们的搜索字词类似但不完全相似的字词: | `quikc~ brwn~ foks~` | 这使用Damerau-Levenshtein距离找到所有最多只有两个变化的术语,其中一个变化是单个字符的插入,删除或替换,或两个相邻字符的变换。 默认编辑距离为2,但编辑距离为1应足以捕获所有人为拼写错误的80%。 它可以指定为: | `quikc~``1` | ### 邻近搜索 虽然短语查询(例如“john smith”)期望所有的词语具有完全相同的顺序,但是邻近查询允许指定的词语更远或者以不同的顺序。 以相同的方式,模糊查询可以指定单词中的字符的最大编辑距离,接近搜索允许我们指定短语中的单词的最大编辑距离: | `"fox quick"``~``5` | 字段中的文本越接近查询字符串中指定的原始顺序,文档则被认为是相关。 与上述示例查询相比,短语“quick fox”将被认为比“quick brown fox”更相关。 ### 范围 可以为日期,数字或字符串字段指定范围。 包含的范围使用方括号[min TO max]和大括号{min TO max}的排除范围指定。 2012年的每一天 | `date:[``2012``-``01``-``01` `TO ``2012``-``12``-``31``]` | 数字1到5 | `count:[``1` `TO ``5``]` | 标签在alpha到omega之间但不包含alpha和omega | `tag:{alpha TO omega}` | 数字1到无群大 | `count:[``10` `TO *]` | 日期: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``)` | 查询字符串中范围的解析可能很复杂并且容易出错。 使用显式范围查询是更可靠的。 ### 特殊字符 使用boost运算符^使一个术语比另一个更相关。 例如,如果我们想查找关于狐狸的所有文档,但我们对快速狐狸特别感兴趣: | `quick^``2` `fox` | 默认提升值为1,但可以是任何正浮点数。 在0和1之间升高降低相关性。 提升也可以应用于短语或组: | `"john smith"``^``2`   `(foo bar)^``4` | ### 布尔运算符 默认情况下,所有字词都是可选的,只要一个字词匹配。 搜索foo bar baz会找到包含foo或bar或baz中的一个或多个的任何文档。 我们已经讨论了上面的default_operator,它允许你强制所有的术语是必需的,但也有布尔运算符,可以在查询字符串本身使用,以提供更多的控制。 首选运算符是+(此项必须存在)和 - (此项不能存在)。 所有其他条款是可选的。 例如,此查询: | `quick brown +fox -news` | 说明: * fox必须存在 * news不存在 * quick 和brown是可选的 - 它们的存在增加相关性 还支持熟悉的操作符AND,OR和NOT(也写为&&,||和!)。 然而,这些操作符的效果可能比第一眼明显的复杂。 NOT优先于AND,优先于OR。 而+和 - 只影响运算符右边的项,AND和OR可以影响左边和右边的项。 | `使用AND,OR和NOT重写上述查询表明复杂性:` `quick OR brown AND fox AND NOT news` `这是不正确的,因为brown现在是必需的术语。` `(quick OR brown) AND fox AND NOT news` `这是不正确的,因为现在需要快速或棕色中的至少一个,并且对这些术语的搜索将与原始查询不同地打分。` `((quick AND fox) OR (brown AND fox) OR fox) AND NOT news` `此表单现在正确复制原始查询的逻辑,但相关性评分与原始查询具有很少相似性。` `相反,使用匹配查询重写的同一查询将如下所示:` `{` `"bool"``: {` `"must"``:     { ``"match"``: ``"fox"`         `},` `"should"``:   { ``"match"``: ``"quick brown"` `},` `"must_not"``: { ``"match"``: ``"news"`        `}` `}` `}` | ### 分组 多个术语或子句可以与括号组合在一起,形成子查询: | `(quick OR brown) AND fox` | 组可用于定位特定字段,或用于提高子查询的结果: | `status:(active OR pending) title:(full text search)^``2` | ### 保留字符 如果您需要在查询中使用作为运算符的任何字符(而不是运算符),则应使用前用反斜杠转义它们。 例如,要搜索(1 + 1)= 2,您需要将查询写为\(1 \ +1 \)\ = 2。 保留字符为:+ - = && || > <! (){} [] ^“〜*?:\ / 无法正确转义这些特殊字符可能会导致语法错误,阻止您的查询运行。 | `请看这里:` `空格也可以是保留字符。 例如,如果你有一个同义词列表将“wi fi”转换为“wifi”,query_string搜索“wi fi”将失败。` `查询字符串解析器会将您的查询解释为搜索“wi OR fi”,而存储在索引中的条件实际上是“wifi”。` `转义空格将保护它不被查询字符串解析器,如:“wi \ fi”。` | ### 空查询 如果查询字符串为空或仅包含空格,则查询将生成空结果集。