Elasticsearch核心技术与实战学习笔记 29 | 单字符串多字段查询:Multi Match

一 序

  本文属于极客时间Elasticsearch核心技术与实战学习笔记系列。

二 单字符串多字段查询: Multi Match

2.1 三种场景

   

最佳字段(Best Fields)

  • 当字段之间相互竞争,又相互关联。例如 title 和 body 这样的字段,评分来自最匹配字段

多数字段(Most Fields)

  • 处理英文内容时:一种常见的手段是,在主字段(English Analyzer),抽取词干,加入同义词,以匹配更多的文档。相同的文本,加入子字段(Standard Analyzer),以提供更加精确的匹配。其他字段作为匹配文档提高性相关度的信号。匹配字段越多越好

混合字段(Cross Field)

  • 对于某些实体,例如人名,地址,图书信息。需要在多个字段中确定信息,单个字段只能作为整体的一部分。希望在任何这些列出的字段中尽可能找出多的词

 Multi Match Query

  • Best Fields 是默认类型,可不指定
  • Minimum should match 等参数可以传递到生成的 query 中

上面的这个例子:外面multi_match 声明类型,有个query语句,同时指定匹配到哪些查询字段上。而且这个type是best_fields,就是意味着这些查询会在这些字段中取一个分数最高的作为返回结果,同时tie_breaker也是可以指定。

查询demo

创建一个索引:

PUT /titles
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "english"
      }
    }
  }
}

type指定为text字段,采用英语分词器分词。

POST titles/_bulk
{ "index": { "_id": 1 }}
{ "title": "My dog barks" }
{ "index": { "_id": 2 }}
{ "title": "I see a lot of barking dogs on the road " }

插入数据

从返回的结果来看,不是我们想要的顺序,为什么呢?

因为采用了英语分词器,会把查询语句拆分成bark dog这个两个单词,而这两个单词出现的频率再文档1,2是一样的,但是文档1 更短所以就排到前面。

    怎么设定maping来优化呢?

DELETE /titles
PUT /titles
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "english",
        "fields": {"std": {"type": "text","analyzer": "standard"}}
      }
    }
  }
}

对于mapping增加fileds:这里的standard analyzer,standard analyzer它不会对词干做任何的提取,这样就不会损失查询的信息。

重建索引之后,需要重新导入数据,这里我们在执行查询,默认是best_fields,我们指定为most_fields,可以吧 "title", "title.std"算分做叠加。

这样就可以吧最匹配的结果显示在第一位了。

2.3 跨字段搜索

  •  most_fields 无法使用 opeartor
  • 可以用 copy_to 解决,但是需要额外的储存空间
  • cross_fields 可以支持 operator
  • 与 copy_to 相比,其中一个优势就是可以在搜索时为某个字段提升权重

demo:

插入数据

PUT address/_doc/1
{
  "street":"5 Poland Street",
  "city" : "Lodon",
  "country":"United Kingdom",
  "postcode" : "W1V 3DG"
}

使用most_feilds查询未空 :因为例子中的查询条件是分布到不同字段上的,而且算分是出现在不同字段上的,没有很好的算分。

改为cross_filed:就能查到

小结:

通过Multi Match可以更好的实现单字符串多字段查询。

学到这里,我发现es真的比MySQL复杂的多。起码就查询sql来看。

猜你喜欢

转载自blog.csdn.net/bohu83/article/details/106449012