检索相关
- 基于Term的查询
Term是表达语意的最小单位,在ES中,term查询,对输入不做分词,会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分。
第一个查询能查得到,第二个查询查不到。根据dynamic mapping,desc字段是text,会对文档内容进行分词器处理。所以录入iPone会在倒排索引里记录了iphone,所以能查得到。productId经过分词器处理后,会以’-'切割成一个一个字符存起来,所以term查询去找productId是找不到的。dynaminc mapping默认是会创建多字段mapping的,所以解决方案是使用productId.keyword。
- 符合查询-Constant Score转为Filter
1.将Query转成Filter,忽略TF-IDF计算,避免相关性算分的开销
2.Filter可以有效利用缓存
- 基于全文的查询
MatchQuery/Match Phrase Query/Query String Query,
查询字符串先传递一个合适的分词器,然后生成一个供查询的词项列表,对每个词逐个进行底层的查询,最终将结果进行合并,并为每个文档生成一个算分。
Operator操作,确定match query的多个单词的关系
Minium_should_match,最少匹配个数
Match Phrase Query
Phrase Match意为短语匹配,查询词语会经过分词器处理,但是它要求文档包含所有搜索词条的文档,并且词条的位置要邻接,可以通过slop参数控制词条间距。
总结
- 结构化数据
// 布尔值
POST products/_search
{
"query": {
"term": {
"avaliable": {
"value": "false"
}
}
}
}
// 数字range,日期range
...
// 处理空值,必需不存在date字段
POST products/_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "date"
}
}
}
}
}
// 查找多个精确值,terms,相当于term的OR
// 查询name 带Mike或者John的
POST stu/_search
{
"query": {
"terms": {
"name.keyword": ["Mike", "John"]
}
}
}
- 对于多字段类型,term是包含而不是相等,对于多字段查询要注意
- bool查询
- bool查询语法
- 单字符串多字段查询: Dis Max Query
Dis Max Query将任何与任一查询匹配的文档作为结果返回,采用字段上最匹配的评分最终评分返回。
上面的查询 Brown fox在文档2的title最匹配,所以它的socre会高一些。
- 单字符串多字段查询Multi Match
三种场景: 1.最佳字段,当字段之间相互竞争,又相互关联,评分取最匹配字段。2.多数字段,在主字段抽取词干,加入同义词,以匹配更多文档,相同的文本,加入子字段(Standard Analyzer),以提供更加精确的匹配,其他字段作为匹配文档提高相关度的信号,匹配字段越多则越好。3.混合字段,对于某些实体,例如人名,地址,图书信息,需要在多个字段中确定信息,单个字段只能作为整体的一部分。
Best Fields的例子
Most Fields的例子
Cross Fields跨字段搜索,解决不能使用operator问题,要求每个查询词都要出现,用and。
- Search Template 解耦程序
创建search template
<