es总结5

基于Term的查询

  • Term的重要性
    • Term是表达语意的最小单位。搜索和利用统计语言模型进行自然语言处理都需要处理Term。
  • 特点
    • Term Level Query:Term Query/Range Query/Exists Query/Prefix Query/Wildcard Query
    • 在ES中,Term查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分。
    • 可以通过Constant Score将查询转换成一个Filtering,避免算分。
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
POST /product/_bulk
{"index":{"_id":1}}
{"productID" : "p1","desc" : "iPhone"}
{"index":{"_id":2}}
{"productID":"XHDK-A-9947-fL5","desc":"iPad"}
{"index":{"_id":3}}
{"productID":"XHDK-A-1937-fV7","desc":"MBP"}

GET /product/_search

POST /product/_search
{
"query": {
"term": {
"desc": {
"value": "iphone"
}
}
}
}

POST /product/_search
{
"query": {
"term": {
"productID.keyword": {
"value": "XHDK-A-9947-fL5"
}
}
}
}

基于全文本的查找

  • 基于全文本的查找
    • Match Query/ Match Phrase Query /Query String Query
  • 特点
    • 索引和搜索时都会进行分词,查询字符串先传递一个合适的分词器,然后生成一个供查询的词项列表
    • 查询时候,会先对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合并。每个文档生成一个算分。

avatar

结构化搜索

  • 结构化搜索是指对结构化数据的搜索
    • 日期,布尔河数字都是结构化的
  • 文本也可以是结构化的。

  • ES中的结构化搜索

    • 布尔、时间、日期和数字这类结构化数据,有精确的格式,可以对这些格式进行逻辑操作。包括比较数字或时间的范围,或判定两个值的大小。
    • 结构化的文本可以做精确匹配或者部分匹配,Term查询和Prefix前缀查询
    • 结构化结果只有是或否两个值,根据场景需要,可以决定结构化搜索是否需要打分
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
POST /product/_bulk
{"index":{"_id":1}}
{"price":10,"avaliable":true,"date":"2018-01-01","productID" : "p1","desc" : "iPhone"}
{"index":{"_id":2}}
{"price":20,"avaliable":true,"date":"2018-01-01","productID":"XHDK-A-9947-fL5","desc":"iPad"}
{"index":{"_id":3}}
{"price":30,"avaliable":false,"date":"2018-01-01","productID":"XHDK-A-1937-fV7","desc":"MBP"}

POST /product/_search
{
"query": {
"term": {
"avaliable": {
"value": true
}
}
}
}

POST /product/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"avaliable": true
}
},
"boost": 1.2
}
}
}

POST /product/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"price": {
"gte": 20,
"lte": 20
}
}
},
"boost": 1.2
}
}
}

日期range

avatar

相关性算分

相关性-Relevance

  • 搜索的相关性算分,描述了一个文档和查询语句匹配的程度。ES会对每个匹配查询条件的结果进行算分_score
  • 打分的本质是排序,需要把最符合用户需求的文档排在前面。ES5之前,默认的相关性算分采用TF-IDF,现在采用BM25
1
2
3
4
5
词          文档id

区块链 1,2,3
的 2,3,4,5,6,7,9,10,12
应用 2,3,8,9,10,13,15

词频 TF

  • Term Frequency:检索词在一篇文档中出现的频率
    • 检索词出现的次数除以文档的总字数
  • 度量一条查询和结果文档相关性的简单方法:简单将搜索中每一个词的TF进行相加
    • TF(区块链) + TF(的) +TF(应用)
  • Stop Word
    • “的”在文档中出现了很多次,但是对贡献相关度几乎没有用处,不应该考虑它们的TF

逆文档频率

avatar

TF-IDF的概念

  • TF-IDF被公认为是检索领域最重要的发明
  • 除了在信息检索,在文献分类和其他相关领域有着非常广泛的应用
  • 现代搜索引擎,对TF-IDF进行了大量细微的优化

  • 评分公式

avatar

  • BM25

avatar

Query Context & Filter Context

Query Context: 相关性算分,Filter Context: 不需要算分

bool查询

  • 一个 bool查询,是一个或者多个查询子句的组合,总共包括4种子句。其中两种会影响算分,2种不影响算分
  • 相关性并不只是全文检索的专利,也适用于yes|no的子句,匹配的子句越多,相关性评分越高。如果多条查询子句被合并为一条查询子句,比如bool查询,则每个查询子句计算得出的评分会被合并到总的相关性评分中。
1
2
3
4
must     : 必须匹配,贡献算分
should : 选择性匹配,贡献算分
must_not : Filter Context 查询子句,必须不能匹配
filter : Filter Context 必须匹配,但是不贡献算分

单字符串多字段查询

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
POST blog/_search
{
"query":{
"bool":{
"should":[
{"match":{"title":"fox"}},
{"match":{"body":"fox"}},
]
}
}
}

算分过程

1. 查询should语句中的两个查询
2. 加和两个查询的评分
3. 乘以匹配语句的总数
4. 除以所有语句的总数

上例中,title和body相互竞争,不应该将分数简单叠加,而是应该找到单个最佳匹配的字段的评分

Disjunction Max Query

将任何与任一查询匹配的文档作为结果返回。采用字段上最匹配的评分作为最终评分返回。

POST blog/_search
{
"query":{
"dis_max":{
"queries":[
{"match":{"title":"fox"}},
{"match":{"body":"fox"}},
]
}
}
}

三种场景:

  • 最佳字段(Best Fields):当字段之间相互竞争,又相互关联。例如title和body这样的字段。评分来自最匹配字段
  • 多数字段(Most Fields):处理英文内容时,一种常见的手段是,在主字段,抽取词干,加入同义词,以匹配更多的文档。
  • 混合字段(Cross Field):对于某些实体,需要在多个字段中确认信息,单个字段只是整体的一部分。
1
2
3
4
5
6
7
8
9
10
11
12
POST blogs/_search
{
"query":{
"multi_match":{
"type": "best_fields",
"query": "Quick pets",
"fields": ["title","body"],
"tie_breaker": 0.2
"minimum_should_match" :"20%"
}
}
}