ES匹配查询

本文介绍了ElasticSearch中的匹配查询,包括基于词项的Term Query、基于全文的Match Query和Match Phrase Query,以及Wildcard Query和Regexp Query。强调了Term Query的精确匹配和Match Query的灵活性,探讨了在业务场景中如何根据数据格式选择合适的查询方式,以提高查询效率和用户体验。
摘要由CSDN通过智能技术生成

作为经典的文档检索数据库,ElasticSearch提供了丰富的接口来搜索数据,满足用户不同的搜索需求。我们的系统为了支持实时字段明细查询功能,会将数据实时写入ES。整个系统数据量较多且维度丰富,每天写入的文档数据达到10多亿条,单个最大索引存储达到2T以上,除了满足业务的查询功能需求之外,数据的时效性以及存储空间都是系统必须优化考虑的问题。本文对ES中一些常用的匹配查询方式原理及其在业务系统中的使用场景进行介绍。
匹配查询
ElasticSearch官方对文本查询介绍了两种方式:基于词项和基于全文的查询。
基于词项
基于词项的查询只对倒排索引的词项精确匹配,查询时没有分析阶段,不会对词的多样性进行处理,假若使用“Hello”进行关键词检索时,不会搜索到倒排索引中包含单词“hello”的词条。
典型的基于词项查询我们以term query为具体案例进行介绍:
创建索引数据
在解释查询模式之前,首先创建索引数据,在索引中分别定义exact_value和full_text字段作为keyword和text两种数据类型字符串。

PUT my_index/_mapping/my_type
{
   
  "properties": {
   
    "exact_value": {
   
      "type": "keyword"
    },
   "full_text": {
   
      "type": "text"
   }
 }
}

PUT my_index/my_type/1
{
   
  "exact_value": "Hello World!", 
  "full_text": "Hello World!" 
}

索引中keyword和text两种不同的数据类型,我来看看两个字段分别在倒排索引中的创建索引的方式。
Keyword:exact_value字段
{
“tokens”: [
{
“token”: “Hello World!”,
“start_offset”: 0,
“end_offset”: 12,
“type”: “word”,
“position”: 0
}
]
}
Text:full_text字段
{
“tokens”: [
{
“token”: “hello”,
“start_offset”: 0,
“end_offset”: 5,
“type”: “”,
“position”: 0
},
{
“token”: “world”,
“start_offset”: 6,
“end_offset”: 11,
“type”: “”,
“position”: 1
}
]
}
由于keyword类型字段不会经过分析器处理,exact_value在倒排索引中以[Hello Wrold!]的完整形式建立索引;text类型经过分析器处理,分析器会将内容进行字符过滤、分词、大小写转换等操作,full_text字段在倒排索引中拆分为[hello、world]两个单词元素形式建立索引。
Term Query
对上述写入索引的文档,使用term查询方式,我们来看看效果

1、GET my_index/my_type/_search
一、实验目的和背景 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、付费专栏及课程。

余额充值