介绍

Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎。它能帮助你搜索、分析和浏览数据,而往往大家并没有在某个项目一开始就预料到需要这些功能。Elasticsearch之所以出现就是为了重新赋予原始数据新的活力。

学习过程中主要参考:

提醒

注意先查看自己使用的elasticsearch的版本。Open edX中目前使用的elasticsearch为0.92版,十分落后,以至于许多特性都和最新的版本不一致

#目的

  • for open edx
  • for my note system
  • full-text search

#关键概念 index -> type -> document

类比数据库的话,我们可以认为

1
2
3
:::text
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

install

当然是使用docker,最为方便啦

1
2
3
4
sudo docker pull elasticsearch
sudo mkdir -p /data/elasticsearch
sudo docker run -d --name elasticsearch -p 9200:9200 -v /data/elasticsearch:/usr/share/elasticsearch/data elasticsearch
sudo docker exec  elasticsearch env #我的是:ELASTICSEARCH_VERSION=2.3.0

#quick start 我们跟着这个案例走一遍:searching_data

案例中有用到_bulk,关于_bulk,参考这里:JSON Bulk import to Elasticstearch

我们来看一下原始数据(book_document.json)

1
2
3
4
5
6
7
8
{"index": {"_index": "library", "_type": "book", "_id": "1"}}
{"title": "All Quiet on the Western Front","otitle": "Im Westen nichts Neues","author": "Erich Maria Remarque","year": 1929,"characters": ["Paul Bäumer", "Albert Kropp", "Haie Westhus", "Fredrich Müller", "Stanislaus Katczinsky", "Tjaden"],"tags": ["novel"],"copies": 1, "available": true,"section" : 3}
{"index": {"_index": "library", "_type": "book", "_id": "2"}}
{"title": "Catch-22","author": "Joseph Heller","year": 1961,"characters": ["John Yossarian", "Captain Aardvark","Chaplain Tappman", "Colonel Cathcart", "Doctor Daneeka"],"tags": ["novel"],"copies": 6, "available" : false,"section" : 1}
{"index": {"_index": "library", "_type": "book", "_id": "3"}}
{"title": "The Complete Sherlock Holmes","author": "Arthur Conan Doyle","year": 1936,"characters":["Sherlock Holmes","Dr. Watson", "G. Lestrade"],"tags":[],"copies": 0, "available" : false, "section" : 12}
{"index": {"_index": "library", "_type": "book", "_id": "4"}}
{"title": "Crime and Punishment","otitle": "Преступлéние и наказáние","author": "Fyodor Dostoevsky","year": 1886,"characters": ["Raskolnikov", "Sofia Semyonovna Marmeladova"],"tags": [],"copies": 0, "available" : true}

交互工具使用httpie取代curl

导入数据

http POST :9200/_bulk < book_document.json

http http://localhost:9200/library/book/_count , 一共有4条数据

搜索

1
2
3
http GET :9200/library/book/_search query:='{"query_string":{"query":"title:crime"}}' #/<index>/<type>

http GET :9200/library/book/_search query:='{"query":{"match_all":{}}}'

日常管理

  • 列出所有index:/_cat/indices?v (http localhost:9200/_cat/indices?v)
    • 而在0.92版本中则要使用/_status (http localhost:9200/_status),旧版的文档参考这里

用例

如果你在Open edX中启用课程/内容搜索功能,那么课程数据将被索引到elasticsearch里。目前这部分有一个问题,当课程被删除后索引还存在,如果不手动删除,用户还能检索出课程。这是个bug

我们先探索索引的结构

1
2
3
http localhost:9200/_status
http localhost:9200/courseware_index/_status
http localhost:9200/courseware_index/_search
1
2
3
4
5
6
7
#查找特定课程索引
http  localhost:9200/courseware_index/_search?q="course-v1:edX+DemoX+Demo_Course" #可以看到index和type

#删除特定课程索引
http delete "localhost:9200/courseware_index/course_info/_query?q=course-v1:edX+DemoX+Demo_Course"
#or
curl -XDELETE "localhost:9200/courseware_index/course_info/_query?q=course-v1:edX+DemoX+Demo_Course"

一些学习笔记

分析和分析器

标准化这些词为标准形式,提高它们的“可搜索性”或“查全率”

####标准分析器 标准分析器是Elasticsearch默认使用的分析器。对于文本分析,它对于任何语言都是最佳选择(译者注:就是没啥特殊需求,对于任何一个国家的语言,这个分析器就够用了) 它根据Unicode Consortium的定义的单词边界(word boundaries)来切分文本,然后去掉大部分标点符号。最后,把所有词转为小写

object嵌套的索引

Lucene 并不了解内部对象。 一个 Lucene 文件包含一个键-值对应的扁平表单。 为了让 Elasticsearch 可以有效的索引内部对象,将文件转换为扁平格式

例如:

1
2
3
4
5
6
7
8
9
{
    "tweet":            [elasticsearch, flexible, very],
    "user.id":          [@johnsmith],
    "user.gender":      [male],
    "user.age":         [26],
    "user.name.full":   [john, smith],
    "user.name.first":  [john],
    "user.name.last":   [smith]
}

关联内部对象可解决此类问题,我们称之为嵌套对象

映射和分析

映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型(string, number, booleans, date等)。

#####查看映射 GET /edx_tracking_log/_mapping/logs

string类型字段默认值是analyzed,对于不允许全文索引的字段需要注明

1
2
3
4
5
6
{
    "tag": {
        "type":     "string",
        "index":    "not_analyzed"
    }
}

周边

至于logstashkibana,将作为单独的章节介绍

更多案例参考elastic/examples

#参考