一 序

使用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。

es java搜索高亮 es搜索所有字段_单语句

当然也不是说cross_fileds 就是最好的,也有误搜索的情况。就是es自带的分词分到多个fields,分词不够准确。

还没找到干预的手段。