ElasticSearch之找到乔丹的空中大灌篮电影

写在前面

本文看一个搜索的实际例子,找到篮球之神乔丹的电影Space Jam,即空中大灌篮。

正式开始之前先来看下要查询的目标文档,以及查询的text:

  • 要查询的目标文档
{
    ...
    "title": "Space Jam",
    ...
    "overview": "Michael Jordan agrees to help the Looney Tunes play a basketball game against alien slavers to determine their freedom.",
    ...
}
  • 查询的text
basketball with cartoon aliens

另,本文测试数据,从这里 下载。

1:实战

首先我们来准备数据:

DELETE tmdb/
PUT tmdb/
  • 在命令行执行
    注意进入到数据文件所在目录:
curl -H "Content-Type: application/json"  -XPOST "192.168.10.64:9210/tmdb/_bulk" --data-binary @javaio-appendfile1709014272558.json

查看是否成功:
在这里插入图片描述
接着来查询:

POST tmdb/_search
{
      "_source": ["title","overview"],
      "size":20,
      "query": {
          "multi_match": {
              "query": "basketball with cartoon aliens",
              "fields": ["title^10","overview"]
          }
      },
      "highlight" : {
            "fields" : {
                "overview" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] },
                "title" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] }
            }
        }

}

在这里插入图片描述
乔丹的电影并没有优先返回,这是因为在overview中包含basketbal和alien,但是查询语句是basketball with cartoon aliens,而字段默认的分词器是standard,在查询时,搜索的词项也会默认使用和所查询字段一样的分词器来生成词项数组,而standard分词器会将aliens生成词项aliens,所以是无法匹配overview中的alien,就导致无法目标文档,我们可以尝试将搜索条件改为basketball with cartoon alien来看下:

POST tmdb/_search
{
      "_source": ["title","overview"],
      "size":20,
      "query": {
          "multi_match": {
              "query": "basketball with cartoon alien",
              "fields": ["title","overview"]
          }
      },
      "highlight" : {
            "fields" : {
                "overview" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] },
                "title" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] }
            }
        }

}

有两处改动,一是将aliens改为alien来匹配overview中的alien,二是因为title不是查询的重点,所以将其权重删除,就能正常查询了:
在这里插入图片描述

在上面说了在查询时,搜索的词项也会默认使用和所查询字段一样的分词器来生成词项数组,所以我们可以将overview的分词器设置english分词器。如下:

DELETE tmdb/
PUT tmdb/
{
    "mappings": {
        "properties": {
            "overview": {
                "type": "text",
                "analyzer": "english"
            }
        }
    }
}

curl -H "Content-Type: application/json"  -XPOST "192.168.10.64:9210/tmdb/_bulk" --data-binary @javaio-appendfile1709014272558.json

再除去title的权重,但依然搜索aliens,看下:

POST tmdb/_search
{
      "_source": ["title","overview"],
      "size":20,
      "query": {
          "multi_match": {
              "query": "basketball with cartoon aliens",
              "fields": ["title","overview"]
          }
      },
      "highlight" : {
            "fields" : {
                "overview" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] },
                "title" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] }
            }
        }

}

在这里插入图片描述
依然可以正常查询。

从以上的例子可以看出,搜索引擎并不能一蹴而就,要根据用户的查询习惯,实际返回数据的准确度,正确的数据是否被返回,用户是否点击了最优先的数据等等信息,来动态的调整mapping以及分词器的信息。

写在后面

参考文章列表

ElasticSearch之单值多字段查询以及multi match

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值