Elasticsearch 全文匹配查询

dis_max查询

相比使用bool查询,我们可以使用dis_max查询(Disjuction Max Query)。Disjuction的意思"OR"(而Conjunction的意思是"AND"),因此Disjuction Max Query的意思就是返回匹配了任何查询的文档,并且分值是产生了最佳匹配的查询所对应的分值:

{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}

可以发现,两份文档的分值是一模一样的。

我们期望的是同时匹配了title字段和body字段的文档能够拥有更高的排名,但是结果并非如此。需要记住:dis_max查询只是简单的使用最佳匹配查询子句得到的_score

tie_breaker

但是,将其它匹配的查询子句考虑进来也是可能的。通过指定tie_breaker参数:

{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ],
            "tie_breaker": 0.3
        }
    }
}

现在文档2的分值比文档1稍高一些。

tie_breaker参数会让dis_max查询的行为更像是dis_maxbool的一种折中。它会通过下面的方式改变分值计算过程:

  1. 取得最佳匹配查询子句的_score
  2. 将其它每个匹配的子句的分值乘以tie_breaker
  3. 将以上得到的分值进行累加并规范化。

通过tie_breaker参数,所有匹配的子句都会起作用,只不过最佳匹配子句的作用更大。


/caiyun_index/spider_result/_search      post

{

  "query": {
    "multi_match": {
      "query": "test",
      "type": "best_fields",
      "fields": [
        "title",
        "文本",
        "url",
        "附件.pdf",
        "附件.others",
        "附件.picture"
      ],
      "tie_breaker": 0.3
    }
  }

}


。。。。。。。。。。。。。。。注意上面的查询要是字符类型 field中都是字符类型,int 类型就是int 类型,不能再field 包含多个类型

一、实验目的和背景 Elasticsearch是一个开源的分布式全文搜索引擎,可以支持各种类型的数据存储和检索。匹配查询Elasticsearch中最常用的查询类型之一,它可以根据查询条件匹配数据集中的文档,并返回相关的结果。本次实验的目的是通过对Elasticsearch匹配查询的实验,了解其查询性能、精确度和召回率等指标,为后续的应用提供参考。 二、实验环境和工具 本次实验使用的环境和工具如下: - Elasticsearch版本:7.9.3 - Kibana版本:7.9.3 - 数据集:电影评论数据集 - 查询语句:"action" AND "thrilling" 三、实验步骤和结果 1. 创建索引 使用Kibana的Dev Tools创建索引,并指定字段类型和分词器: ``` PUT /movie_review { "mappings": { "properties": { "movie_title": { "type": "text", "analyzer": "standard" }, "review_text": { "type": "text", "analyzer": "english" } } } } ``` 2. 导入数据 使用Kibana的Dev Tools导入电影评论数据集: ``` POST /movie_review/_bulk { "index": { "_id": "1" }} { "movie_title": "Inception", "review_text": "This is an action-packed and thrilling movie." } { "index": { "_id": "2" }} { "movie_title": "The Dark Knight", "review_text": "This is another action-packed and thrilling movie." } { "index": { "_id": "3" }} { "movie_title": "Interstellar", "review_text": "This is a sci-fi movie with some action and thrilling moments." } ``` 3. 执行查询 使用Kibana的Dev Tools执行查询语句: ``` GET /movie_review/_search { "query": { "match": { "review_text": { "query": "action AND thrilling" } } } } ``` 4. 实验结果 查询结果如下所示: ``` { "took" : 13, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : 0.6931472, "hits" : [ { "_index" : "movie_review", "_type" : "_doc", "_id" : "2", "_score" : 0.6931472, "_source" : { "movie_title" : "The Dark Knight", "review_text" : "This is another action-packed and thrilling movie." } }, { "_index" : "movie_review", "_type" : "_doc", "_id" : "1", "_score" : 0.57735026, "_source" : { "movie_title" : "Inception", "review_text" : "This is an action-packed and thrilling movie." } }, { "_index" : "movie_review", "_type" : "_doc", "_id" : "3", "_score" : 0.2876821, "_source" : { "movie_title" : "Interstellar", "review_text" : "This is a sci-fi movie with some action and thrilling moments." } } ] } } ``` 查询结果共返回了三个文档,其中第二个文档的匹配度最高,得分为0.6931472。 四、实验分析和总结 通过本次实验,我们可以得出以下结论: 1. Elasticsearch匹配查询功能可以根据查询条件匹配数据集中的文档,并返回相关的结果。 2. 分词器的选择对查询结果有很大的影响,不同的分词器会对文本进行不同的分词处理。 3. 查询性能受到多方面的因素影响,包括索引的大小、查询条件的复杂度等。 4. 精确度和召回率是衡量匹配查询效果的重要指标,需要针对具体的应用场景进行评估。 综上所述,Elasticsearch匹配查询是一个非常强大的功能,可以帮助我们快速地检索和分析大量的文本数据。在实际应用中,我们需要根据具体的需求来选择合适的分词器和查询语句,以达到最优的查询效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值