Query DSL
Domain Specific Language
某种领域中特定的查询语言,这是是指 elasticsearch 中的 query 语言
Query and filter context
一段查询语句的结果集取决于其中所使用的 查询内容 query context 和 过滤内容 filter context
Query context
How well does this document match this query clause?
这个文档内容匹配查询语句结果怎么样?
注意,查询结果中的 score 受 query context 影响。
Filter context
Does this document match this query clause?
这个文档内容匹配这个查询语句吗?
1 | GET *nginx*/_search |
- 整个 query 属于查询内容 query context
- bool 和 match 被用于 query context 中,会影响查询分数
- filter 用于过滤查询内容
- term 和 range 被用于 filter context 中,不会影响分数
Match All Query
Match All Query
最简单的查询方式。查询所有匹配的 documents,如果全部查询出来,则 _score = 1.0
1 | GET *nginx*/_search |
可以设置 boost 来改变结果分数:
1 | GET *nginx*/_search |
Match None Query
是 match_all 的反例
1 | GET *nginx*/_search |
1 | { |
Full text queries
全文查询允许搜索分析文本字段,在索引中,利用查询字符串处理相同的分析器。
预存数据:
1 | POST /eminoda_test/_doc |
match query
The standard query for performing full text queries, including fuzzy matching and phrase or proximity queries.
这是个标准的查询匹配方式来进行全文匹配,包括模糊,短语,近似查询。
match 接受 text/numerics/dates ,构造一个查询请求,并且分析查询结果。
查询 eminoda_test 索引,documents 中字段为 name ,值为 eminoda 的结果:
1 | GET /eminoda_test/_search |
1 | { |
match query 处理结果是 bool 类型。会构造一个 bool 的查询对 text 文本的分析结果进行返回,默认会对 text 的内容进行 or 操作(有 or 和 and)。
默认搜索器:default search analyzer
比如,skill = jquery node 会返回 3 条记录:
1 | GET /eminoda_test/_search |
1 | "hits" : { |
如果设置 operator = and ,则会对结果有影响:
1 | GET /eminoda_test/_search |
1 | "hits" : { |
fuzziness 允许对模糊查询,并可以设置模糊度。规范讲应该是:Levenshtein Edit Distance
如,允许对 skill 的 text “出错” 2 个字符:
1 | GET /eminoda_test/_search |
1 | "hits" : { |
match_phrase query
Like the match query but used for matching exact phrases or word proximity matches.
和 match query 类似,但多用于匹配短语 or 单词的接近匹配。
如果用 match 方式,则会返回 三条 记录,此匹配会以 text 内容做精确匹配
1 | GET /eminoda_test/_search |
1 | "hits" : { |
match_phrase_prefix query
Like the match_phrase query, but does a wildcard search on the final word.
和 match_phrase query 类似,但通过通配符作用于最后个单词匹配
1 | GET /eminoda_test/_search |
1 | "hits" : { |
match_bool_prefix query
Creates a bool query that matches each term as a term query, except for the last term, which is matched as a prefix query
创建一个 bool 查询来匹配查询结果,除了最后一个作为前缀查询匹配
multi_match query
The multi-field version of the match query.
多结果匹配查询
1 | GET /eminoda_test/_search |
1 | "hits" : { |
common terms query
A more specialized query which gives more preference to uncommon words.
更特殊的查询方式,针对不友好的单词。
query_string query
Supports the compact Lucene query string syntax, allowing you to specify AND|OR|NOT conditions and multi-field search within a single query string. For expert users only.
支持 Lucene 查询字符串语法,允许使用特殊的条件(and、or、not),和多条件的搜索一个简单的查询字符串。
1 | GET /eminoda_test/_search |
simple_query_string query
A simpler, more robust version of the query_string syntax suitable for exposing directly to users.
intervals query
A full text query that allows fine-grained control of the ordering and proximity of matching terms
细粒度控制相近匹配结果
最后
以上列出目前使用过的几种,其他方式未花时间做过多实践。可结合官网在做深入。