Elasticsearch 全文搜索引擎的个人学习笔记

2020-03-14 19:48:39 +08:00
 CoolSpring

这篇文章是我对自己在自学探索 Elasticsearch 全文搜索功能时学到的概念的一个总结(如果是大佬,请手下留情),大概算是 A Quick Glimpse Into Elasticsearch (Full-Text Search Part),并不一定能帮助读者建构起对于 Elasticsearch 本身客观成体系的认识。(实际上如果只是为了使用 Elasticsearch,也并不需要完全了解其工作机制。)如有需要可参考文末的官方文档和参考资料。

为什么用 Elasticsearch 来做全文检索,而不是 MySQL 等数据库自带的检索功能?

(当然 Elasticsearch 还有分析、聚合等其他功能,而 MySQL 等关系型数据库也有其更广泛丰富的需求,两者的定位并不相同。一般推荐将常规数据库作为业务数据的主要存储处,向 Elasticsearch 导入其中的部分数据进行索引以方便搜索。)

怎么安装?

https://www.elastic.co/cn/downloads/elasticsearch 有详细的逐步介绍。

没有什么特殊的依赖、配置等,只需要下载解压运行,或者 yum / apt / homebrew,抑或 docker。

安装完成后,Elasticsearch Server 默认运行于本机 9200 端口,提供 REST API——这意味着现在可以通过普通的浏览器来尝试访问。http://localhost:9200/ (另有 9300 端口供 TCP 协议客户端使用和节点间通信)

可以通过 bulk 来批量导入 JSON 形式的数据,或者使用 Logstash 等从已有数据库中导入。

基础概念简介

Query DSL 中和全文搜索相关的一些查询关键词

建议使用 curl 命令来测试下面的查询。官方给出的示例:

curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
    "query" : {
        "match" : { "user": "kimchy" }
    }
}'

如果要用浏览器 URI 进行简单搜索则需要用到 Lucene 查询语法(参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.htmlhttps://lucene.apache.org/core/2_9_4/queryparsersyntax.html ),给个例子(注意 AND ): http://localhost:9200/post_index/_search?q=user:CoolSpring%20AND%20content:Surface&size=30&pretty。

包含多个词的 match 查询经过分词后可以改写,前述第一个 match 查询示例在内部等效于

{
"query": {
  "bool": {
    "should": [
      {"term": { "text": "quick" }},
      {"term": { "text": "fox"   }}
    ]
  }
}
}

结语

Elasticsearch 的使用实在很难穷尽,笔者在自学过程中还只能管窥一二,许多功能还没来得及探索。在写这篇文章的时候,关于导入文档的具体操作等重要内容也没有提及。不过有句话说得好,文档和代码是最好的学习资源。Elasticsearch 基于 Apache Lucene,分为 Apache 2.0 授权下的开源版、Elastic License 下的免费版,和商业版。(不过就普通使用的小规模搜索用途而言不大需要研究它的代码。)官方英文文档见: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html。

参考资料:

  1. 引用了来自官方文档的一些例子;

  2. What is ElasticSearch? Why ElasticSearch? Advantages of ElasticSearch!: https://medium.com/@AIMDekTech/what-is-elasticsearch-why-elasticsearch-advantages-of-elasticsearch-47b81b549f4d (写了一半查资料时看到这篇文章,深受启发。一部分内容参考了它,在此感谢并推荐。)

4308 次点击
所在节点    Elasticsearch
9 条回复
hugee
2020-03-14 20:28:21 +08:00
感觉好重啊
Heartbleed
2020-03-14 20:32:36 +08:00
这个是不是没有 Python 版本的..
hantsy
2020-03-14 20:59:58 +08:00
@Heartbleed 服务器端跟你没关系的。一般使用都是客户端,各种语言的 Client 应该都有。
CoolSpring
2020-03-14 22:43:41 +08:00
@Heartbleed
关于客户端官方提供了两个 Python 库:更灵活自由的 low-level 的[elasticsearch-py]( https://github.com/elastic/elasticsearch-py)和更 Pythonic 的 high-level 的[elasticsearch-dsl-py]( https://github.com/elastic/elasticsearch-dsl-py)
L00kback
2020-03-14 23:03:16 +08:00
顶一顶,在数据分析领域是一个很实用的工具。配合 kibana 做可视化太舒服了,非常快速,功能强大。
est
2020-03-15 01:22:24 +08:00
把 ES 调教好不容易。比如默认 shard 几个好?
SpencerCJH
2020-03-15 02:43:31 +08:00
我最近在集成阿里云的 open search,目的就是降低这一块的学习门槛...
yepinf
2020-03-15 10:01:58 +08:00
ES 好像也是吃内存大户

团队最后用了 solr
ddup
2020-03-15 10:14:43 +08:00
ES 用起来还是挺简单的,吃透还是要下一番功夫的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/652832

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX