Elasticsearch是一个开源的搜索引擎框架。

Elasticsearch安装和启动

安装前提:Elasticsearch需要Java7或以上的版本。

  1. 下载压缩包并解压:

    1
    2
    3
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.1.zip
    unzip elasticsearch-6.6.1.zip
    cd elasticsearch-6.6.1
  2. 进入解压后的文件目录,启动elasticsearch:

    1
    ./bin/elasticsearch
  3. 如果一切正常,elasticsearch默认在本机9200端口运行。打开另一个命令行窗口,执行以下命令,检查elasticsearch是否运行成功:

    1
    curl localhost:9200

    如果输出以下信息,则运行正常。

  4. 默认情况下,elasticsearch只允许本机访问。要想其他电脑可以访问,也就是实现远程访问,需要修改文件/config/elasticsearch.yml,取消字段network.host的注释,把该字段的值改为0.0.0.0。这样的话所有的电脑都能访问,实际情况中,最好不要这样。

  5. 如果启动遇到错误“Native controller process has stopped - no new native processes can be started”或“max virtual memory areas vm.maxmapcount [65530] is too low”。解决方法是执行以下命令:

    1
    sudo sysctl -w vm.max_map_count=262144

在python中使用elasticsearch

要先安装elasticsearch包。在python中使用elasticsearch要先启动elasticsearch。

1
pip install elasticsearch

创建index

1
2
3
4
5
from elasticsearch import Elasticsearch 
es = Elasticsearch() #创建实例,默认localhost:9200
# es = Elasticsearch([{'host':'10.112.1.109','port':'9200'}]) #远程访问
result = es.indices.create(index = 'news',ignore = 400)
print(result)

如果创建成功,会返回以下信息

1
{'acknowledged': True, 'shards_acknowledged': True, 'index': 'test_es'}

如果再次创建,就会返回以下信息:

1
{'error': {'root_cause': [{'type': 'resource_already_exists_exception', 'reason': 'index [news/TrkzNdXZRi6ReiZqOM2Dvg] already exists', 'index_uuid': 'TrkzNdXZRi6ReiZqOM2Dvg', 'index': 'news'}], 'type': 'resource_already_exists_exception', 'reason': 'index [news/TrkzNdXZRi6ReiZqOM2Dvg] already exists', 'index_uuid': 'TrkzNdXZRi6ReiZqOM2Dvg', 'index': 'news'}, 'status': 400}

表示创建失败,失败的原因是要创建的index已经存在了。status状态码是400。

插入数据

1
2
3
4
5
6
7
8
9
10
11
datas = [
{'title':"算法导论(原书第2版)",
'url':"https://book.douban.com/subject/1885170/",
'introduction':"这本书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。这本书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。"},
{'title':"计算机程序的构造和解释",
'url':"https://book.douban.com/subject/1148282/",
'introduction':"《计算机程序的构造和解释(原书第2版)》1984年出版,成型于美国麻省理工学院(MIT)多年使用的一本教材,1996年修订为第2版。在过去的二十多年里,《计算机程序的构造和解释(原书第2版)》对于计算机科学的教育计划产生了深刻的影响。第2版中大部分重要程序设计系统都重新修改并做过测试,包括各种解释器和编译器。作者根据其后十余年的教学实践,还对其他许多细节做了相应的修改。"},

]
for i in range(len(datas)):
es.index(index = 'book',doc_type = 'computer',id = i+1,body = datas[i])

index()方法可以完成两个操作,如果数据不存在,那就插入数据;如果数据已经存在,那就更新数据。

get()按ID查询

1
2
result= es.get(index='book',doc_type='computer',id =1)
print(result['_source'])

search()实现全文检索

对于中文,我们要安装一个中文分词插件elasticsearch-analysis-ik。可以使用elastic的另一个命令行工具elastisearch-plugin来安装,要确保版本号一致。进入elastic的目录下,执行:

1
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip

注意将6.3.0替换为自己的版本号。安装成功后,重启elasticsearch,就会自动加载这个中文分词插件。

1
2
3
4
5
6
7
8
9
10
11
es = Elasticsearch()
mapping = {
'properties': {
'title': {
'type': 'text',
'analyzer': 'ik_max_word',
'search_analyzer': 'ik_max_word'
}
}
}
result = es.indices.put_mapping(index='news', doc_type='politics', body=mapping)

指定使用中文分词器,如果不指定默认使用英文分词器。

1
2
3
4
5
6
7
8
dsl = {
'query': {
'match': {
'introduction': '计算机'
}
}
}
result = es.search(index='news', doc_type='politics', body=dsl)

参考链接