Fork me on GitHub

elasticSearch-query-builder使用文档

前言

在这里,我想向大家推荐一个我自己开发的项目,也就是elasticsearch-query-builder,这个项目目前在github
上已经开源,有兴趣的朋友可以去fork或者star,你的star就是对我最大的鼓励。同时,本项目长期维护和更新,
我也接受并且很高兴有小伙伴向本项目pull request,或者协同开发,有兴趣的同学可以给我发邮件。

elasticsearch-query-builder是一个非常方便构造elasticsearch(后面简称ES) DSL 查询语句的工具包,在elasticsearch-query-builder
中,我尝试基于配置化的操作去构建ES的查询语句,并且接受外界传入参数,这极大的减少了在Java代码中构建ES
查询语句的工作,并同时减少了代码量,使代码更加直观和清晰。基于使ES中DSL构造语句和Java代码分离的思想,
elasticsearch-query-builder诞生了。去GithubFork!

构建

elasticsearch-query-builder工程一般作为jar包为别的工程提供使用,当然,如果需要基于本项目做二次开发,这都需要将
Github上克隆本项目到本地

1
git clone https://github.com/xiaowei1118/elasticsearch-query-builder.git

在将本项目克隆到本地后,执行mvn package 将本项目打成jar包,或者直接将本项目作为你们自己maven项目的module项目。

elasticsearch-query-builder使用详细说明

elastcisearch-query-builder接受配置文件(特定json格式)或者json格式的字符串配置,配置格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"index": "user_portrait",
"type": "docs",
"from": "${from}",
"size": "10",
"include_source": ["name","age"], //需要哪些字段
"exclude_source": ["sex"], //排除哪些字段
"query_type": "terms_level_query",
"terms_level_query": {
"terms_level_type": "term_query",
"term_query": {
"value": "${value}",
"key": "key",
"boost": 2
}
},
"aggregations": [
{
"aggregation_type": "terms",
"name": "",
"field": "field",
"sub_aggregations": {
"aggregation_type": "terms",
"name": "sub",
"field": "field",
"size": "${size.value}",
"sort": "asc",
"sort_by": "_count"
}
}
],
"highlight":{
"fields": [
{
"field": "content",
"number_of_fragment": 2,
"no_match_size": 150
}
],
"pre_tags":["<em>"],
"post_tags":["</em>"]
},
"sort": [
"_score",
{
"field": "age",
"order": "asc"
}
]
}

参数说明

# index

index表示elasticSearch中的索引或者别名。

# type

type表示elasticSearch索引或者别名下的type。

# from

from表示检索文档时的偏移量,相当于关系型数据库里的offset。

# include_source

include_source 搜索结果中包含某些字段,格式为json数组,"include_source": ["name","age"]

# exclude_source

exclude_source 搜索结果中排除某些字段,格式为json数组,"exclude_source":["sex"]

# query_type

query_type表示查询类型,支持三种类型terms_level_query,text_level_query,bool_level_query,并且这三种类型
不可以一起使用。

  • terms_level_query 操作的精确字段是存储在反转索引中的。这些查询通常用于结构化数据,
    如数字、日期和枚举, 而不是全文字段,包含term_query,terms_query,range_query,exists_query 等类型。

  • text_level_query 查询通常用于在完整文本字段 (如电子邮件正文) 上运行全文查询。他们了解如何分析被查询的字段,
    并在执行之前将每个字段的分析器 (或 search_analyzer) 应用到查询字符串。

    包含 match_query,multi_match_query,query_string,simple_query_string 等类型。

  • bool_query 与其他查询的布尔组合匹配的文档匹配的查询。bool 查询映射到 Lucene BooleanQuery。它是使用一个或多个布尔子句生成的, 每个子句都有一个类型化的实例。
    布尔查询的查询值包括: must,filter,should,must_not. 想要了解这几个类型的差异,可以查阅elasticSearch的相关文档 在每个布尔查询的查询类型值中,
    可以包含terms_level_query 和 text_level_query中任意的查询类型,如此便可以构造非常复杂的查询情况。

# terms_level_query查询类型
terms_level_type

terms_level查询类型,支持term_query,terms_query,range_query,exists_query查询。

  • term_query

    • key 表示elasticSearch中需要查询的字段
    • value 表示要查询的值
    • boost 占搜索中的权重
      1
      2
      3
      4
      5
      "term_query": {
      "value": "",
      "key": "",
      "boost": 2
      }
  • terms_query

    • key,value,boost解释同term_query
    • value 可以传入多个,以逗号隔开,如”[1,2]”。
      1
      2
      3
      4
      "terms_query": {
      "value": "[1,2]", //数组
      "key": ""
      },
  • range_query,给定的查询条件使一个范围

    • key 表示elasticSearch中需要查询的字段
    • range 表示要搜索的值范围,格式如”[a,b]”,表示范围在a、b之间,a、b可以缺省,a缺省则表示没有下限,
      b缺省则表示没有上限,但ab不可以同时为空。a,b可以为时间或者数值。
    • boost 占搜索中的权重
    • format 如果范围使时间的化,format定义时间格式。
    • include_lower 布尔值,是否包含下限。
    • include_upper 布尔值,是否包含上限。
      1
      2
      3
      4
      5
      6
      7
      8
      "range_query": {
      "key": "",
      "range": "", //[,]
      "boost": "",
      "format": "",
      "include_lower": true,
      "include_upper": false
      }
  • exists_query,存在查询,查找字段不存在的文档。

    • key elasticSearch字段。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      "exists_query": {
      "key": ""
      }
      ```

      ##### # text_level_query查询类型
      ##### text_query_type
      text_level_query查询类型,支持match_query,multi_match_query,query_string,simple_query_string等。
      + match_query,普通的文本匹配查询。
      + key 供文本匹配的ES字段
      + value 需要搜索的文本关键字,会分词。
      + zero_terms_query 决定是否使用停词。all表示不使用停词,默认使none。

“match_query”: {
“key”: “”,
“value”: “this is a test”,
“zero_terms_query”: “none”
}

1
2
3
4
+ multi_match_query 在多个字段中进行文本匹配
+ value 需要搜索的文本关键字,会分词。
+ fields ES中的字段,可以多个,用逗号隔开,在字段旁边使用^表示该字段的权重,如"a^3,b"。
+ type 匹配类型,支持best_fields(默认),most_fields,cross_fields,phrase,phrase_prefix。

“multi_match_query”: {
“value”: “”,
“fields”: “a^3,b”,
“type”: “best_fields” //most_fields,cross_fields,phrase,phrase_prefix
},

1
2
3
4

+ query_string 字符串文本匹配。
+ value 需要搜索的文本关键字,会分词。
+ fields ES中的字段,格式为数组,如"[a,b]"

“query_string”: {
“value”: “”,
“fields”: “”//数组
}

1
2
3
+ simple_query_string 简单字符串匹配
+ value fields 同 query_string
+ default_operate 匹配逻辑,值为`and` 或者 `or`。

“simple_query_string”: {
“value”: “”,
“fields”: “”, //数组
“default_operate”: “and”
}
`

  • match_all_query 匹配所有文档
# bool_query 布尔查询

bool_query一般用于构建复杂的查询,而这正是elasticsearch-query-builder最拿手的地方。

bool_type
  • must
  • should
  • filter
  • must_not
# aggregation 聚合
您的支持将鼓励我继续创作!