ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

这篇具有很好参考价值的文章主要介绍了ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

全文搜索两个最重要的方面是:

  • 相关性(Relevance) 它是评价查询与其结果间的相关程度,并根据这种相关程度对结果排名的一种能力,这种计算方式可以是 TF/IDF 方法、地理位置邻近、模糊相似,或其他的某些算法。
  • 分词(Analysis) 它是将文本块转换为有区别的、规范化的 token 的一个过程,目的是为了创建倒排索引以及 查询倒排索引。

一、构造数据

1、数据库中当前数据

ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

 2、构建索引

PUT http://127.0.0.1:9200/study

# 请求数据
{
    "settings": {
        "index": {
            "number_of_shards": "1",
            "number_of_replicas": "0"
        }
    },
    "mappings": {
        "properties": {
            "name": {
                "type": "text"
            },
            "age": {
                "type": "integer"
            },
            "mail": {
                "type": "keyword"
            },
            "hobby": {
                "type": "text",
                "analyzer": "ik_max_word"
            }
        }
    }
}

# 响应数据
{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "study"
}

ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

3、添加数据

POST http://127.0.0.1:9200/study/_bulk

# 请求数据
{"index":{"_index":"study"}} 
{"name":"张三","age": 20,"mail": "111@qq.com","hobby":"羽毛球、乒乓球、足球"} 
{"index":{"_index":"study"}} 
{"name":"李四","age": 21,"mail": "222@qq.com","hobby":"羽毛球、乒乓球、足球、篮球"} 
{"index":{"_index":"study"}} 
{"name":"王五","age": 22,"mail": "333@qq.com","hobby":"羽毛球、篮球、游泳、听音乐"} 
{"index":{"_index":"study"}} 
{"name":"赵六","age": 23,"mail": "444@qq.com","hobby":"跑步、游泳"} 
{"index":{"_index":"study"}} 
{"name":"孙七","age": 24,"mail": "555@qq.com","hobby":"听音乐、看电影"}

# 响应数据
{
    "took": 16,
    "errors": false,
    "items": [
        {
            "index": {
                "_index": "study",
                "_type": "_doc",
                "_id": "i6jJdoIBU4c5cKp3GGKx",
                "_version": 1,
                "result": "created",
                "_shards": {
                    "total": 1,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 0,
                "_primary_term": 1,
                "status": 201
            }
        },
        {
            "index": {
                "_index": "study",
                "_type": "_doc",
                "_id": "jKjJdoIBU4c5cKp3GGKx",
                "_version": 1,
                "result": "created",
                "_shards": {
                    "total": 1,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 1,
                "_primary_term": 1,
                "status": 201
            }
        },
        {
            "index": {
                "_index": "study",
                "_type": "_doc",
                "_id": "jajJdoIBU4c5cKp3GGKx",
                "_version": 1,
                "result": "created",
                "_shards": {
                    "total": 1,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 2,
                "_primary_term": 1,
                "status": 201
            }
        },
        {
            "index": {
                "_index": "study",
                "_type": "_doc",
                "_id": "jqjJdoIBU4c5cKp3GGKx",
                "_version": 1,
                "result": "created",
                "_shards": {
                    "total": 1,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 3,
                "_primary_term": 1,
                "status": 201
            }
        },
        {
            "index": {
                "_index": "study",
                "_type": "_doc",
                "_id": "j6jJdoIBU4c5cKp3GGKx",
                "_version": 1,
                "result": "created",
                "_shards": {
                    "total": 1,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 4,
                "_primary_term": 1,
                "status": 201
            }
        }
    ]
}

ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

二、全文搜索

2.1、单词搜索

POST  http://127.0.0.1:9200/study/_search

# 请求数据
{
    "query": {
        "match": {
            "hobby": "音乐"
        }
    },
    "highlight": {
        "fields": {
            "hobby": {}
        }
    }
}

# 响应数据
{
    "took": 67,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 0.9395274,
        "hits": [
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "j6jJdoIBU4c5cKp3GGKx",
                "_score": 0.9395274,
                "_source": {
                    "name": "孙七",
                    "age": 24,
                    "mail": "555@qq.com",
                    "hobby": "听音乐、看电影"
                },
                "highlight": {
                    "hobby": [
                        "听<em>音乐</em>、看电影"
                    ]
                }
            },
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "jajJdoIBU4c5cKp3GGKx",
                "_score": 0.77041256,
                "_source": {
                    "name": "王五",
                    "age": 22,
                    "mail": "333@qq.com",
                    "hobby": "羽毛球、篮球、游泳、听音乐"
                },
                "highlight": {
                    "hobby": [
                        "羽毛球、篮球、游泳、听<em>音乐</em>"
                    ]
                }
            }
        ]
    }
}

ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

过程说明:

1. 检查字段类型

        爱好 hobby 字段是一个 text 类型( 指定了IK分词器),这意味着查询字符串本身也应该被分词。

2. 分析查询字符串 。

        将查询的字符串 “音乐” 传入IK分词器中,输出的结果是单个项 音乐。因为只有一个单词项,所以 match 查询执 行的是单个底层 term 查询。

3. 查找匹配文档 。

        用 term 查询在倒排索引中查找 “音乐” 然后获取一组包含该项的文档,本例的结果是文档:3 、5 。

4. 为每个文档评分 。

        用 term 查询计算每个文档相关度评分 _score ,这是种将 词频(term frequency,即词 “音乐” 在相关文档的 hobby 字段中出现的频率)和 反向文档频率(inverse document frequency,即词 “音乐” 在所有文档的 hobby 字段中出现的频率),以及字段的长度(即字段越短相关度越高)相结合的计算方式。

2.2、单词搜索

POST  http://127.0.0.1:9200/study/_search

# 请求数据
{
    "query": {
        "match": {
            "hobby": "音乐 篮球"
        }
    },
    "highlight": {
        "fields": {
            "hobby": {}
        }
    }
}

# 响应数据
{
    "took": 22,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.5408251,
        "hits": [
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "jajJdoIBU4c5cKp3GGKx",
                "_score": 1.5408251,
                "_source": {
                    "name": "王五",
                    "age": 22,
                    "mail": "333@qq.com",
                    "hobby": "羽毛球、篮球、游泳、听音乐"
                },
                "highlight": {
                    "hobby": [
                        "羽毛球、<em>篮球</em>、游泳、听<em>音乐</em>"
                    ]
                }
            },
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "j6jJdoIBU4c5cKp3GGKx",
                "_score": 0.9395274,
                "_source": {
                    "name": "孙七",
                    "age": 24,
                    "mail": "555@qq.com",
                    "hobby": "听音乐、看电影"
                },
                "highlight": {
                    "hobby": [
                        "听<em>音乐</em>、看电影"
                    ]
                }
            },
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "jKjJdoIBU4c5cKp3GGKx",
                "_score": 0.77041256,
                "_source": {
                    "name": "李四",
                    "age": 21,
                    "mail": "222@qq.com",
                    "hobby": "羽毛球、乒乓球、足球、篮球"
                },
                "highlight": {
                    "hobby": [
                        "羽毛球、乒乓球、足球、<em>篮球</em>"
                    ]
                }
            }
        ]
    }
}

ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

        上面查询中只要是包含篮球和音乐的都被查询出来了。但是这有时候不能达到我们的要求,我们大部分时候都是希望两个词是同时包含的。这时候可以使用elasticsearch中指定词之间逻辑关系operator:"and"

POST  http://127.0.0.1:9200/study/_search

# 请求数据
{
    "query": {
        "match": {
            "hobby": {
                "query": "音乐 篮球",
                "operator": "and"
            }
        }
    },
    "highlight": {
        "fields": {
            "hobby": {}
        }
    }
}

# 响应结果
{
    "took": 6,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 1.5408251,
        "hits": [
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "jajJdoIBU4c5cKp3GGKx",
                "_score": 1.5408251,
                "_source": {
                    "name": "王五",
                    "age": 22,
                    "mail": "333@qq.com",
                    "hobby": "羽毛球、篮球、游泳、听音乐"
                },
                "highlight": {
                    "hobby": [
                        "羽毛球、<em>篮球</em>、游泳、听<em>音乐</em>"
                    ]
                }
            }
        ]
    }
}

ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

        上面的测试结果都是选择了"and"和"or"两个极端情况下,但是在真正搜索中,我们不会使用这两个极端情况的,这样就需要另外一种查询方式,即为只需要符合一定的相似度就可以查询到的数据,在elasticsearch中就支持这种查询方式,如使用minimum_should_match来指定匹配度,如60%。

POST  http://127.0.0.1:9200/study/_search

# 请求数据
{
    "query": {
        "match": {
            "hobby": {
                "query": "游泳 羽毛球",
                "minimum_should_match": "80%"
            }
        }
    },
    "highlight": {
        "fields": {
            "hobby": {}
        }
    }
}

# 响应数据
{
    "took": 6,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 2.1933634,
        "hits": [
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "jajJdoIBU4c5cKp3GGKx",
                "_score": 2.1933634,
                "_source": {
                    "name": "王五",
                    "age": 22,
                    "mail": "333@qq.com",
                    "hobby": "羽毛球、篮球、游泳、听音乐"
                },
                "highlight": {
                    "hobby": [
                        "<em>羽毛球</em>、篮球、<em>游泳</em>、听音乐"
                    ]
                }
            },
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "i6jJdoIBU4c5cKp3GGKx",
                "_score": 1.7171206,
                "_source": {
                    "name": "张三",
                    "age": 20,
                    "mail": "111@qq.com",
                    "hobby": "羽毛球、乒乓球、足球"
                },
                "highlight": {
                    "hobby": [
                        "<em>羽毛球</em>、乒乓<em>球</em>、足球"
                    ]
                }
            },
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "jKjJdoIBU4c5cKp3GGKx",
                "_score": 1.6262295,
                "_source": {
                    "name": "李四",
                    "age": 21,
                    "mail": "222@qq.com",
                    "hobby": "羽毛球、乒乓球、足球、篮球"
                },
                "highlight": {
                    "hobby": [
                        "<em>羽毛球</em>、乒乓<em>球</em>、足球、篮球"
                    ]
                }
            }
        ]
    }
}

ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

2.3、组合搜索

        在搜索时除了上面的方法外,还可以使用过滤器中的bool组合搜索。

POST  http://127.0.0.1:9200/study/_search

# 请求数据
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "hobby": "篮球"
                }
            },
            "must_not": {
                "match": {
                    "hobby": "音乐"
                }
            },
            "should": [
                {
                    "match": {
                        "hobby": "游泳"
                    }
                }
            ]
        }
    },
    "highlight": {
        "fields": {
            "hobby": {}
        }
    }
}

# 响应数据
{
    "took": 6,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.77041256,
        "hits": [
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "jKjJdoIBU4c5cKp3GGKx",
                "_score": 0.77041256,
                "_source": {
                    "name": "李四",
                    "age": 21,
                    "mail": "222@qq.com",
                    "hobby": "羽毛球、乒乓球、足球、篮球"
                },
                "highlight": {
                    "hobby": [
                        "羽毛球、乒乓球、足球、<em>篮球</em>"
                    ]
                }
            }
        ]
    }
}

注意:上面示例中在搜索结果中必须包含篮球,不能包含音乐,如果包含了游泳,那么它的相似度更高。

评分的计算规则

  • bool 查询会为每个文档计算相关度评分 _score , 再将所有匹配的 must 和 should 语句的分数 _score 求和, 最后除以 must 和 should 语句的总数。
  • must_not 语句不会影响评分; 它的作用只是将不相关的文档排除。

注意:默认情况下,should中的内容不是必须匹配的,如果查询语句中没有must,那么就会至少匹配其中一个。当然了, 也可以通过minimum_should_match参数进行控制,该值可以是数字也可以的百分比。

POST  http://127.0.0.1:9200/study/_search

# 请求数据
{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "hobby": "游泳"
                    }
                },
                {
                    "match": {
                        "hobby": "篮球"
                    }
                },
                {
                    "match": {
                        "hobby": "音乐"
                    }
                }
            ],
            "minimum_should_match": 2
        }
    },
    "highlight": {
        "fields": {
            "hobby": {}
        }
    }
}

# 响应数据
{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 2.3112378,
        "hits": [
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "jajJdoIBU4c5cKp3GGKx",
                "_score": 2.3112378,
                "_source": {
                    "name": "王五",
                    "age": 22,
                    "mail": "333@qq.com",
                    "hobby": "羽毛球、篮球、游泳、听音乐"
                },
                "highlight": {
                    "hobby": [
                        "羽毛球、<em>篮球</em>、<em>游泳</em>、听<em>音乐</em>"
                    ]
                }
            }
        ]
    }
}

ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

2.4、权重搜索

        在一些情况下,可能会对某些词增加权重来影响该条数据的得分。

POST  http://127.0.0.1:9200/study/_search

# 请求数据
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "hobby": {
                        "query": "游泳篮球",
                        "operator": "and"
                    }
                }
            },
            "should": [
                {
                    "match": {
                        "hobby": {
                            "query": "音乐",
                            "boost": 10
                        }
                    }
                },
                {
                    "match": {
                        "hobby": {
                            "query": "跑步",
                            "boost": 2
                        }
                    }
                }
            ]
        }
    },
    "highlight": {
        "fields": {
            "hobby": {}
        }
    }
}

# 响应数据
{
    "took": 5,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 9.24495,
        "hits": [
            {
                "_index": "study",
                "_type": "_doc",
                "_id": "jajJdoIBU4c5cKp3GGKx",
                "_score": 9.24495,
                "_source": {
                    "name": "王五",
                    "age": 22,
                    "mail": "333@qq.com",
                    "hobby": "羽毛球、篮球、游泳、听音乐"
                },
                "highlight": {
                    "hobby": [
                        "羽毛球、<em>篮球</em>、<em>游泳</em>、听<em>音乐</em>"
                    ]
                }
            }
        ]
    }
}

ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)文章来源地址https://www.toymoban.com/news/detail-463642.html

到了这里,关于ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Elasticsearch】全文搜索

    全文搜索是ES的关键特性之一,平时我们使用SQL的like语句,搜索一些文本、字符串是否包含指定的,但是如果两篇文章,都包含我们的,具体那篇文章内容的相关度更高? 这个SQL的like语句是做不到的,更别说like语句的性能问题了。 ES通过分词处理、相关度计算

    2024年02月09日
    浏览(43)
  • SpringBoot Elasticsearch全文搜索

    全文搜索(检索),工作原理:计算机索引程序,扫描文章中的每一个词,对每一个词建立一个索引,指明出现次数和位置。查询时通过索引进行查找,类似于查字典。 因为是通过索引在查,速度较于通过sql查,会快很多。 具体过程如下: 1、建文本库 2、建立索引 3、执行

    2024年02月03日
    浏览(58)
  • Elasticsearch全文搜索引擎

    Elasticsearch全文搜索引擎 Elasticsearch简介 windows平台下安装ES 学习ES的预备知识 ES索引操作 ES文档操作 ES高级查询 Golang操作ES起步 Golang操作ES索引 Golang操作ES文档 Golang ES高级查询 Gin集成ES

    2024年02月09日
    浏览(49)
  • Elasticsearch的全文搜索与匹配

    Elasticsearch是一个开源的搜索和分析引擎,基于Lucene库,用于实现全文搜索和实时分析。它具有高性能、高可扩展性和高可用性,适用于大规模数据的搜索和分析。Elasticsearch的核心功能包括文档存储、搜索引擎、分析引擎和数据可视化。 Elasticsearch的全文搜索功能是其最重要的

    2024年02月22日
    浏览(44)
  • 关于Elasticsearch全文搜索引擎

    我们可以把它简称为ES,但是搜索它的资料时(例如百度)还是使用Elasticsearch进行搜索更准确, 这个软件不再是SpringCloud提供的,它也不针对微服务环境的项目来开发 Elasticsearch和redismysql一样,不仅服务于java语言,其它语言也可以使用,它的功能也类似一个数据库,能高效的从

    2024年02月05日
    浏览(61)
  • 全文搜索引擎 Elasticsearch详解

    Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的

    2023年04月22日
    浏览(43)
  • elasticsearch ES搜索权重设置(boost参数)

    摘要:7.Elasticsearch boost的搜索条件权重_lm324114的专栏-CSDN博客_boost es 摘要2:elasticsearch boost - 简书 摘要3:Elasticsearch 10 Boost(提升权重) - 简书

    2024年02月12日
    浏览(43)
  • 全文搜索引擎 Elasticsearch 入门使用

    目录 1、安装 2、基本概念 2.1 Node 与 Cluster 2.2 Index 2.3 Document  2.4 Type 3、新建和删除 Index 4、中文分词设置  5、数据操作  5.1 新增记录  5.2 查看记录   5.3 删除记录 5.4 更新记录  6、数据查询 6.1 返回所有记录 6.2 全文搜索  6.3 逻辑运算 7、参考链接 本文从零开始,讲解如何

    2024年02月09日
    浏览(44)
  • 开源的全文搜索引擎Elasticsearch

    Elasticsearch是一个开源的全文搜索引擎,可以实现快速、实时的数据搜索和分析。它是基于Apache Lucene的搜索引擎库开发而来,提供了一个分布式、多租户的全文搜索引擎平台,能够支持海量数据的实时检索、聚合分析和可视化展示。 Elasticsearch 的主要特点包括: 分布式架构:

    2024年02月08日
    浏览(49)
  • Elasticsearch 全文搜索引擎 ---- IK分词器

            原理:分词的原理:二叉树                  首先讲一下为什么要出这个文章,前面我们讲过分词方法: 中文分词搜索 pscws (感兴趣的同学可以去爬楼看一下),那为什么要讲 IK分词 ?最主要的原因是:pscws分词 颗粒度 不如IK分词的颗粒度高,现在的需求

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包