美文网首页
ElasticSearch 查询基本概念

ElasticSearch 查询基本概念

作者: SolidHeart | 来源:发表于2019-04-12 17:10 被阅读0次

前言

本文Elastic Search版本为6.7,将介绍ES的查询的基本概念和用法。

Query 和 Filter

Elastic Search中的搜索有两类,一类是查询(Query),一类是匹配(Filter)。在现实中我们会使用组合查询的方式组合两类查询,并获取相关的文档。
Query和Filter的区别是什么呢?
(1)Filter相当于是一个过滤函数,他只返回true或者false两种结果。他可以用以下伪代码表示

//fn为一种filter函数
fn = Filter(condition)
//使用filter函数接收document返回ture或者false
fn.apply(document) => {ture,flase}
//doc集合使用filter函数过滤符合条件的doc
set<Document>.stream().filter(fn).collect()

如果filter函数返回true,那么表示该document符合条件将会保留下来,否则将会被过滤。一般参与filter计算的是Document中数值相关或者状态值相关的字符串。

(2) Query是一种相关度评分函数,他会根据条件对文档进行评分,评分越高表示该文档的相关度越高。一般会用于文本匹配,或者进阶的自定义函数评分。
我们使用以下伪代码表示(仅用于理解,ES内部的计算过程使用了分词和反向索引,并不是这样的)

//fn是一种相关度query函数
fn = Query(conditon)
//使用fn会计算出document的分数
fn.apply(document) = score
//系统将使用评分函数进行评分,相关度越高的文档排名越前
Set<Document>.stream().map(tuple.of(document,fn.apply(document))).sortBy(Tuple::second).collect()

bool组合查询

在这里将介绍bool查询,bool查询包含四种操作符,分别是must,should,must_not,query。他们均是一种数组,数组里面是对应的判断条件。

  • 在must域定义的所有query条件,document都必须都相关才能被召回
  • 在filter域定义的所有filter条件,document必须都满足才能被召回
  • 在should域定义的所有query条件,document至少有一个匹配到条件才能被召回
  • 在must_not定义的所有filter条件,document必须都不满足才能被召回

以下为一个基本的查询例子

POST _search
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "user" : "kimchy" }
      },
      "filter": {
        "term" : { "tag" : "tech" }
      },
      "must_not" : {
        "range" : {
          "age" : { "gte" : 10, "lte" : 20 }
        }
      },
      "should" : [
        { "term" : { "tag" : "wow" } },
        { "term" : { "tag" : "elasticsearch" } }
      ],
      "minimum_should_match" : 1,
      "boost" : 1.0
    }
  }
}

相关文章

网友评论

      本文标题:ElasticSearch 查询基本概念

      本文链接:https://www.haomeiwen.com/subject/pibcwqtx.html