es的匹配方式汇总

match
最简单的一个match例子:

查询和"我的宝马多少马力"这个查询语句匹配的文档。

{
“query”: {
“match”: {
“content” : {
“query” : “我的宝马多少马力”
}
}
}
}
上面的查询匹配就会进行分词,比如"宝马多少马力"会被分词为"宝马 多少 马力", 所有有关"宝马 多少 马力", 那么所有包含这三个词中的一个或多个的文档就会被搜索出来。
并且根据lucene的评分机制(TF/IDF)来进行评分。

match_phrase
比如上面一个例子,一个文档"我的保时捷马力不错"也会被搜索出来,那么想要精确匹配所有同时包含"宝马 多少 马力"的文档怎么做?就要使用 match_phrase 了

{
“query”: {
“match_phrase”: {
“content” : {
“query” : “我的宝马多少马力”
}
}
}
}
完全匹配可能比较严,我们会希望有个可调节因子,少匹配一个也满足,那就需要使用到slop。

{
“query”: {
“match_phrase”: {
“content” : {
“query” : “我的宝马多少马力”,
“slop” : 1
}
}
}
}
multi_match
如果我们希望两个字段进行匹配,其中一个字段有这个文档就满足的话,使用multi_match

{
“query”: {
“multi_match”: {
“query” : “我的宝马多少马力”,
“fields” : [“title”, “content”]
}
}
}
但是multi_match就涉及到匹配评分的问题了。

我们希望完全匹配的文档占的评分比较高,则需要使用best_fields
{
“query”: {
“multi_match”: {
“query”: “我的宝马发动机多少”,
“type”: “best_fields”,
“fields”: [
“tag”,
“content”
],
“tie_breaker”: 0.3
}
}
}
意思就是完全匹配"宝马 发动机"的文档评分会比较靠前,如果只匹配宝马的文档评分乘以0.3的系数

我们希望越多字段匹配的文档评分越高,就要使用most_fields
{
“query”: {
“multi_match”: {
“query”: “我的宝马发动机多少”,
“type”: “most_fields”,
“fields”: [
“tag”,
“content”
]
}
}
}
我们会希望这个词条的分词词汇是分配到不同字段中的,那么就使用cross_fields
{
“query”: {
“multi_match”: {
“query”: “我的宝马发动机多少”,
“type”: “cross_fields”,
“fields”: [
“tag”,
“content”
]
}
}
}
term
term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇

{
“query”: {
“term”: {
“content”: “汽车保养”
}
}
}
查出的所有文档都包含"汽车保养"这个词组的词汇。

使用term要确定的是这个字段是否“被分析”(analyzed),默认的字符串是被分析的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、实验目的和背景 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、付费专栏及课程。

余额充值