一 序
使用ES搜索相关的指标:
Precision (查准率) - 尽可能返回较少的无关文档
Recall (查全率) - 尽量返回较多的相关文档
Ranking - 是否能够按照相关度进行排序
二 单属性查询
在 ES 中,Term 查询,对输入不做分词。所以除非是精准搜索不使用,大小写区别都查不出来。
通常就是使用match:(基于文本的分词,索引和搜索时都会进行分词)
POST movies/_search
{
"query": {
"match": {
"title": "last christmas"
}
}
}
这种就是OR的关系。
如果指定必须查全了(同时出现),可以增加 "operator": "and" 实现。
match_phrase
词之间是and关系,还有指定查询顺序,query的词的顺序不能变。
为了实现模糊查询的效果,可以指定slop的数量
Java API:
boolQueryBuilderOne.should(QueryBuilders.matchPhraseQuery(field, item).slop(es_search_matchPhrase_slop));
或者dsl:
POST movies/_search
{
"query": {
"match_phrase": {
"title": {
"query": "Who Christmas",
"slop": 1
}
}
}
}
三 多属性查询
比如一个商品有多个filed: 有的是指定
POST /gino_product/product/1
{
"productName": "耐克女生运动轻跑鞋",
"brandName": "耐克",
"sortName": "鞋子",
"productKeyword": "耐克,潮流,运动,轻跑鞋"
}
POST /gino_product/product/2
{
"productName": "耐克女生休闲运动服",
"brandName": "耐克",
"sortName": "上衣",
"productKeyword": "耐克,休闲,运动"
}
POST /gino_product/product/3
{
"productName": "阿迪达斯女生冬季运动板鞋",
"brandName": "阿迪达斯",
"sortName": "鞋子",
"productKeyword": "阿迪达斯,冬季,运动,板鞋"
}
POST /gino_product/product/4
{
"productName": "阿迪达斯女生冬季运动夹克外套",
"brandName": "阿迪达斯",
"sortName": "上衣",
"productKeyword": "阿迪达斯,冬季,运动,夹克,外套"
}
你要查询 ”运动上衣“。这时候单个属性就查不到。
multi_match:
默认是Best Fields ,可不指定
最佳字段(Best Fields)
- 当字段之间相互竞争,又相互关联。例如 title 和 body 这样的字段,评分来自最匹配字段
多数字段(Most Fields)
- 处理英文内容时:一种常见的手段是,在主字段(English Analyzer),抽取词干,加入同义词,以匹配更多的文档。相同的文本,加入子字段(Standard Analyzer),以提供更加精确的匹配。其他字段作为匹配文档提高性相关度的信号。匹配字段越多越好
混合字段(Cross Field)
- 对于某些实体,例如人名,地址,图书信息。需要在多个字段中确定信息,单个字段只能作为整体的一部分。希望在任何这些列出的字段中尽可能找出多的词
对于上面的查询,我试过best filelds跟most fileds都查不出结果。cross field 可以。
most_fields 无法使用 opeartor,cross_fields 可以支持 operator。
当然也不是说cross_fileds 就是最好的,也有误搜索的情况。就是es自带的分词分到多个fields,分词不够准确。
还没找到干预的手段。