查询
URI Search
在url中使用参数查询
模糊匹配*, ~1, ~2
Request Body Search
使用ES提供的DSL查询
- 分页、排序、过滤字段
Query类型
- match - A OR B
- match_phrase - A AND B
- query_string - 类似uri search
- simple_query_string
结构化数据查询
boolean
number
date
- 跳过算分
- 处理多值字段
- term查询是包含而不是完全相等
- 增加一个key_count字段进行计数,结合bool query进行精确匹配
条件组合
- 使用复合查询 - bool query,多个查询子句的组合
- query context 和 filter context
- 如何控制精确度?
- 修改结构可能影响算分权重
- boost控制权重
1,增加
- (0, 1),降低
- <0,减分
- boosting: { positive: {}, negative: {} } 提升查询的precision和recall
相关性(Relevance)算分
衡量相关性
- Precision = TP / (TP + FP)
-
TF-IDF
Term Frequency(TF):词频,检索词在一篇文档中出现的频率,检索词出现的次数/文档的总字数
- Document Frequency(DF):文档频率,检索词出现过的文档总数在全部文档中的出现频率
- Inverse DF:log(1/DF)
- TF-IDF : TF * IDF 加权求和
- Lucene中的TF-IDF评分公式:
BM25
- ES 5.0之后的改进版
- 解决了词频无限增加时,TF-IDF也无限增长的问题
- explain参数
各种query
单字符串多字段搜索
三种常见场景下使用 multi match query
- 最佳字段 - best_fields
- 字段之间相互竞争,又相互关联,比如title和body这样的,需要评分来自于最佳字段
- 多数字段 - most_fields
- 混合字段 - cross_fields
disjunction max query
- 用单个内容对多个字段进行查询
- 将任何与任一查询匹配的文档作为返回结果,采用字段上最匹配的评分作为最终评分返回