一、基于词项和基于全文的查询

1. term

term是表达语义的最小单位。搜索和利用统计语言模型进行自然语言处理都需要处理term。

在es中,term查询,对输入的词不做分词,会将输入按照一个整体,在倒排索引中进行精确匹配,查找准确的词项,并且按照相关度算分公式为每个包含该词项的文档进行相关度算分。

term查询主要有以下几类:term query ,range query,exists query,prefix query,Wildcard query (通配符查询)

1.2 基于全文查询

索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词器,然后生成一个供查询的词项列表。

查询的时候,先会对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合并,并为每一个文档生成一个算分。

基于全的查询主要有以下几个分类:Match query ,Match Phrase query,Query String query

1.3结构化搜索

结构化数据,比如日期、布尔类型或者数字类型,简单来说,结构化数据我认为就是不需要对数据进行拆分,这个数据只要不拆分的情况下,才能表达出具体的含义。除此之外,文本也可以是结构化数据,比如 颜色、标签或者关键词、订单编号、产品编码等,它们都要遵守严格的规定、结构化的范式才行。对于结构化的数据,我们是通过基于term(词项)来进行精确匹配或者或者prefix的前缀查询。

其中有一个特殊情况,对于多值查询,它是包含而不是等于。这里是说基于genre.keyword的查询时包含,并且这种包含是严格区分大小写的,而对于genre单独的term查询,还是等于的意思。

#处理多值字段
POST /movies/_bulk
{ "index": { "_id": 1 }}
{ "title" : "Father of the Bridge Part II","year":1995, "genre":"Comedy"}
{ "index": { "_id": 2 }}
{ "title" : "Dave","year":1993,"genre":["Comedy","Romance"] }

#处理多值字段,term 查询是包含,而不是等于
POST movies/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "genre.keyword": "Comedy"
        }
      }
    }
  }
}

可以增加一个genre_count的字段,在写入数据的时候,对genre中词的个数进行计算,一起写入es中,这样查询的时候,结合bool查询,只返回长度是1,并且的(包含的意思)“genre.keyword”: "Comedy"的数据,进行精确查询。

1.4搜索的相关性算分

搜索的相关性算分,描述了一个文档和查询语句匹配的匹配程度。es会对每个匹配查询条件的结果进行算分_score。什么是算分,算分的本质其实就是排序,把最符合用户需求的文档排在最前面。es5之前,默认的算分采用TF-IDF,现在采用BM25。

TF:term frequency,中文称为“词频”,就是一个词在一篇文档中出现的频率,计算方法:

TF=检索词在一篇文档中出现的次数/这篇文档的总字数。

衡量一条查询语句和结果文档相关性的简单方法:将搜索语句中分词出来的每个词的TF进行想加:如

TF(词1)+TF(词2)+TF(词3),当然,这不包括Stop Word,因为尽管这样的词(比如“的”)在文档中出现了很多次,但是对贡献相关度几乎没有用处,不应该考虑他们的TF。

IDF:Inverse Document Frequency,逆文档频率,简单来说,IDF=log(文档频率)。这里的文档频率,其实就是DF。

DF:Document Frequency,检索词在所有文档中出现的概率,简单来说,DF的计算公式就是:

DF=总的文档数/出现过检索词的文档总数

比如“大数据”这个词,出现的文档总数是100万,总的文档数是10亿,那么DF=10亿/100万=1000

而IDF=log(1000)

所以TF-IDF,本质上就是将TF的求和变成了TF的与IDF的加权求和。

TF-IDF=TF(词1)*IDF(词1)+TF(词2)*IDF(词2)+TF(词3)*IDF(词3) +文档大小(长度)的影响值+boost(控制相关的认为手段或者外力干扰项)。

这其实就是说,一个词如果在一篇文章的多次出现,但是在其他文档中出现的次数不多,那么说明这个词在这篇文章中很重要,很大的可能这篇文章就是围绕这个词来来写的,即这个词可能就是这篇文章的中心思想,相反,尽管一个词在一篇文章中出现的次数很多,但是同样在其他文章中出现的次数也很多,那么说明这个词在这篇文章的可能没那么重要,或者就是一个普通的修饰词等等,所以相关性可能就小一些。

TF-IDF被公认为是信息检索领域最重要的发明。

BM25是对TF做了优化,在TF-IDF中,如果一个词在一篇文档中出现的次数非常非常多,这样加权相乘以后,会在一定程度上影响的分,所以BM25中,当TF无限增大时,BM25算分会趋于一个数值。

1.5.query filter 多字符串多字段的查询

在实际的搜索使用中,一般是要支持多项文本输入,来实现多字段的搜索,同时也需要基于价格、时间、年龄等条件进行过滤,其实也是一种搜索(精确搜索)。这就涉及到以下两个内容:

  • Query:会进行相关性算分
  • Filter:不需要算分(因为结果要仅仅为 yes | no,其中,范围也是说是否在这个范围内),这就不需要算分,并且可以利用缓存,提高性能。

bool query:es提供的一种复合查询,也就是多条件查询。一个bool query,其实是一个或者多个查询字句的组合。总共包含4中子句:2中影响算分(must ,should),2种不影响算分(must not ,fiter)。它会把每个查询子句计算得出的评分合并到总的相关性评分中。

查询算分说明
must必须匹配,贡献算分
should选择性匹配,贡献算法
must_notfliter 必须不能匹配,不贡献算分
filterfilter 必须匹配,不贡献算分

bool 查询语句的结构,也会对算分产生影响,同一层级的竞争字段,具有相同的权重,通过改变嵌套bool 查询,可以改变对算分的影响。

boosting query :

POST news/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match": {
          "content": "apple"
        }
      },
      "negative": {
        "match": {
          "content": "pie"
        }
      },
      "negative_boost": 0.5
    }
  }
}

当content中包含apple,会打一个积极的分,就是高分,但是当content中包含pie的时候,就给他打一个消极的分,就是低分,这样最后的结果,消极分的_score就会低,那么就会排序就会靠后。negative_boost设置的是消极的boost是多少数值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值