1、Query DSL的基本语法
{
QUERY_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}
例:
GET /test_index/test_type/_search
{
"query": {
"match": {
"test_field": "test"
}
}
}
2、如何组合多个搜索条件
bool 查询与 bool 过滤相似,用于合并多个查询子句。不同的是,bool 过滤可以直接给出是否匹配成功, 而bool 查询要计算每一个查询子句的 _score (相关性分值)。
- must:: 查询指定文档一定要被包含。
- must_not:: 查询指定文档一定不要被包含。
- should:: 查询指定文档,有则可以为文档相关性加分。
3、filter与query对比
filter,仅仅只是按照搜索条件过滤出需要的数据而已,不计算任何相关度分数,对相关度没有任何影响
query,会去计算每个document相对于搜索条件的相关度,并按照相关度进行排序
一般来说,如果你是在进行搜索,需要将最匹配搜索条件的数据先返回,那么用query;如果你只是要根据一些条件筛选出一部分数据,不关注其排序,那么用filter
除非是你的这些搜索条件,你希望越符合这些搜索条件的document越排在前面返回,那么这些搜索条件要放在query中;如果你不希望一些搜索条件来影响你的document排序,那么就放在filter中即可
filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的自动cache最常使用filter的数据
query,相反,要计算相关度分数,按照分数进行排序,而且无法cache结果
4、各种query搜索语法
1、match all
可以查询到所有文档,是没有查询条件下的默认语句。
GET /_search
{
"query": {
"match_all": {}
}
}
此查询常用于合并过滤条件。 比如说你需要检索所有的邮箱,所有的文档相关性都是相同的,所以得到的_score为1.
2、match
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符:
GET /_search
{
"query": {
"match": {
"title": "my elasticsearch article"
}
}
}
做精确匹配搜索时,你最好用过滤语句,因为过滤语句可以缓存数据。
3、multi match
multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个
GET /company/employee/_search
{
"query": {
"multi_match": {
"query": "xian",
"fields": ["address.*", "name"]
}
}
}
4、range query
range过滤允许我们按照指定范围查找一批数据:
- gt :: 大于
- gte:: 大于等于
- lt :: 小于
- lte:: 小于等于
GET /company/employee/_search
{
"query": {
"range": {
"age": {
"gte": 30
}
}
}
}
5、term query
term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型):
GET /company/employee/_search
{
"query": {
"term": {
"join_date": "2015-01-01"
}
}
}
6、terms query
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:
GET /company/employee/_search
{
"query": {
"terms": {
"age": [
30,
35
]
}
}
}