查询

URI Search

在url中使用参数查询
image.png
模糊匹配*, ~1, ~2

Request Body Search

使用ES提供的DSL查询
image.png

  • 分页、排序、过滤字段

Query类型

  • match - A OR B
  • match_phrase - A AND B
  • query_string - 类似uri search
  • simple_query_string

结构化数据查询

boolean
number
date

  • 跳过算分

image.png

  • 处理多值字段
    • term查询是包含而不是完全相等
    • 增加一个key_count字段进行计数,结合bool query进行精确匹配

条件组合

  • 使用复合查询 - bool query,多个查询子句的组合
    • query context 和 filter context

image.png

  • 如何控制精确度?
    • 修改结构可能影响算分权重
    • boost控制权重
      • 1,增加

      • (0, 1),降低
      • <0,减分
    • boosting: { positive: {}, negative: {} } 提升查询的precision和recall

相关性(Relevance)算分

衡量相关性

  • Precision = TP / (TP + FP)
  • Recall = TP / (TP + FN)

    TF-IDF

  • Term Frequency(TF):词频,检索词在一篇文档中出现的频率,检索词出现的次数/文档的总字数

  • Document Frequency(DF):文档频率,检索词出现过的文档总数在全部文档中的出现频率
  • Inverse DF:log(1/DF)
  • TF-IDF : TF * IDF 加权求和
  • Lucene中的TF-IDF评分公式:

image.png

BM25

  • ES 5.0之后的改进版
  • 解决了词频无限增加时,TF-IDF也无限增长的问题
  • image.png
  • explain参数

各种query

单字符串多字段搜索

三种常见场景下使用 multi match query

  • 最佳字段 - best_fields
    • 字段之间相互竞争,又相互关联,比如title和body这样的,需要评分来自于最佳字段
    • image.png
  • 多数字段 - most_fields
    • image.png
  • 混合字段 - cross_fields
    • 对于某些实体,例如人名地址图书信息等,需要再多个字段中确定信息,单个字段只能作为整体的一部分,希望在任何这些列出的字段中找到尽可能多的词
    • image.png

disjunction max query

  • 用单个内容对多个字段进行查询
  • 将任何与任一查询匹配的文档作为返回结果,采用字段上最匹配的评分作为最终评分返回

image.png