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顶级参数包括:
| 参数 | 描述 |
|---|---|
|
|
要解析的实际查询。参见查询字符串语法。 |
|
|
如果未指定前缀字段,则查询字词的默认字段。默认为 |
|
|
如果未指定显式运算符,则使用默认运算符。例如,使用默认运算符 |
|
|
用于分析查询字符串的分析器名称。 |
|
|
分析器的名称,用于分析查询字符串中的引用短语。对于这些部件,它将覆盖使用 |
|
|
设置时, |
|
|
设置为 |
|
|
控制模糊查询将扩展到的术语数。默认为 |
|
|
|
|
|
设置模糊查询的前缀长度。默认是 |
|
|
设置为 |
|
|
设置短语的默认斜率。如果为零,则需要精确的短语匹配。默认值是 |
|
|
设置查询的提升值。默认为 |
|
|
默认为 |
|
|
默认情况下,不分析查询字符串中的通配符。通过将此值设置为 |
|
|
限制允许创建的regexp查询的自动机状态数。这可以防止太难(例如指数级硬)的regexp。默认为10000。 |
|
|
一个值,用于控制生成的布尔查询中应该匹配的“should”子句的数量。它可以是绝对值( |
|
|
如果设置为 |
|
|
时区应用于与日期相关的任何范围查询。另见 JODA时区。 |
|
|
附加到查询字符串的引用部分的字段的后缀。这允许使用具有不同分析链的字段进行精确匹配。看看这里为一个完整的例子。 |
|
|
是否应为多项同义词自动生成短语查询。默认为 |
|
|
[ 6.0.0 ] 在6.0.0中已弃用。设置 |
在生成多项查询时,可以使用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对多个字段运行查询时,允许使用以下附加参数:
| 参数 | 描述 |
|---|---|
|
|
应如何组合字段以构建文本查询。有关完整示例,请参阅类型。默认为 |
| 参数 | 描述 |
|---|---|
|
|
用于多场的分离最大连接断路器。默认为 |
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使用。
查询字符串被解析为一系列术语和运算符。术语可以是单个单词 - quick或brown - 或短语,由双引号括起来 - "quick brown" 以相同的顺序搜索短语中的所有单词。
操作员允许您自定义搜索 - 可用选项如下所述。
Field names
如查询字符串查询中所述default_field,搜索搜索词,但可以在查询语法中指定其他字段:
其中
status字段包含activestatus:active其中
title字段包含quick或brown。如果省略OR运算符,将使用默认运算符title:(quick OR brown)
title:(quick brown)其中
author字段包含精确短语"john smith"author:"John Smith"
其中任何字段
book.title,book.content或book.date包含quick或brown(注意我们需要如何*使用反斜杠转义):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
alphaandomega, excludingalphaandomega: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将查找包含一个或多个foo或bar或的任何文档 baz。我们已经讨论了default_operator 上面的内容,它允许你强制要求所有的术语,但也有一些布尔运算符可以在查询字符串本身中使用,以提供更多的控制。
首选运算符+(此术语必须存在)和- (此术语不得出现)。所有其他条款都是可选的。例如,这个查询:
quick brown +fox -news
说明:
fox必须存在news一定不能存在quick和brown是可选的 - 它们的存在增加了相关性
熟悉的布尔运算符AND,OR以及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。
保留的字符是: + - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /
无法正确转义这些特殊字符可能会导致语法错误,从而阻止您的查询运行。
<and>根本无法转义。 阻止它们尝试创建范围查询的唯一方法是完全从查询字符串中删除它们。
Empty Query 空查询
如果查询字符串为空或仅包含空格,则查询将生成空结果集。
elasticsearch 基础 —— Query String的更多相关文章
- java操作elasticsearch实现query String
1.CommonTersQuery: 指定字段进行模糊查询 //commonTermsQuery @Test public void test35() throws UnknownHostExcept ...
- Elasticsearch由浅入深(七)搜索引擎:_search含义、_multi-index搜索模式、分页搜索以及深分页性能问题、query string search语法以及_all metadata原理
_search含义 _search查询返回结果数据含义分析 GET _search { , "timed_out": false, "_shards": { , ...
- ELK(elasticsearch+kibana+logstash)搜索引擎(二): elasticsearch基础教程
1.elasticsearch的结构 首先elasticsearch目前的结构为 /index/type/id id对应的就是存储的文档ID,elasticsearch一般将数据以JSON格式存储. ...
- 搜索引擎框架之ElasticSearch基础详解(非原创)
文章大纲 一.搜索引擎框架基础介绍二.ElasticSearch的简介三.ElasticSearch安装(Windows版本)四.ElasticSearch操作客户端工具--Kibana五.ES的常用 ...
- elasticsearch基础查询
Es基础数据类型 string 字符串类型,es中最常用的类型,官方文档 比较重要的参数: index分析 analyzed(默认) not_analyzed no store存储 true 独立存储 ...
- ElasticSearch基础学习(SpringBoot集成ES)
一.概述 什么是ElasticSearch? ElasticSearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎. 它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服 ...
- nodejs笔记三--url处理、Query String;
URL--该模块包含用以 URL 解析的实用函数. 使用 require('url') 来调用该模块. 一.parse函数的基础用法 parse函数的作用是解析url,返回一个json格式的数组,请看 ...
- Elasticsearch 基础入门
原文地址:Elasticsearch 基础入门 博客地址:http://www.extlight.com 一.什么是 ElasticSearch ElasticSearch是一个基于 Lucene 的 ...
- 37.query string、_all metadata
主要知识点 1.query string基础语法 2._all metadata的理解 一.query string基础语法 1.GET /test_index/test_type/_sear ...
随机推荐
- Django组件---Django请求生命周期和中间件
Django组件---Django请求生命周期和中间件 Django请求生命周期 说明: client代表浏览器,浏览器的内部为我们封装了socket,Django的WSGI模块也为我们封装了sock ...
- 028:with标签使用详解
with标签使用详解: 1.在模板中享用使用变量,可以通过 with 语句实现: 2.with 有两种用法,具体情况如下 ( 包括注意事项 ) : index.html: <p>wi ...
- 微信小程序-没有找到 node_modules 目录的解决办法
初次在微信开发者工具构建npm 没有找到 node_modules 目录的解决办法 第一步:设置-->项目设置-->使用npm模块 第二步:右键目录下miniprogram-->终端 ...
- C# 与 C++,语法差别有多小-第三章 C++数据类型 第一部分
一,数据类型 C++: char int short long float double, unsigned long double(128位,19位有效数字), wchar_t, 浮点型文字常量 ...
- Java并发指南14:JUC中常用的Unsafe和Locksupport
本文转自网络,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutoria ...
- IP地址的分类及各类IP的最大网络数、网络号范围和最大主机数
总结自谢希仁老师的<计算机网络>第五版 每一类网络地址都由两部分组成:网络号net-id+主机号host-id.IP地址的分类可以参看下图: 可以看到各个类别的区别,同时,所有的类别都是3 ...
- Type Interceptors
Type Interceptors Castle.Core, part of the Castle Project, provides a method interception framework ...
- 《图解设计模式》读书笔记3-1 Singleton模式
目录 单例模式 饿汉式 懒汉式 线程安全的懒汉式 单例模式 确保任何情况下都只有一个实例 饿汉式 public class Singleton { //在类被加载的时候运行一次,这是本类构造函数的唯一 ...
- spring cloud服务间调用feign
参考文章:Spring Cloud Feign设计原理 1.feign是spring cloud服务间相互调用的组件,声明式.模板化的HTTP客户端.类似的HttpURLConnection.Apac ...
- 涛涛的小马甲 Android之Handler机制
首先需要了解一个基本的概念ANR:Application not response 即应用程序无响应,也就是俗话说的死机. 出现Anr的原因是: 主线程需要做很多重要的事情,响应点击事件,更新UI如果 ...