ubuntu下安装配置Elasticsearch

版本:

ubuntu: 16.04

linux: 4.4.0

Elasticsearch: 5.1.1

提醒: 服务器内存需要大于2G,不然运行不了。

步骤:

一:先安装java环境:

说明: java sdk分2种,一种是官方的oracleJDK,一种是开源的open jdk。

https://www.zhihu.com/question/19646618

因为Elasticsearch是用Java编程语言编写的。Elasticsearch需要Java 7或更高版本。Elasticsearch建议使用Oracle JDK版本1.8.0_73,但JRE的本机Ubuntu OpenJDK本机包也可以。

下面2种可以仍选一种来安装,一般建议是官方的Oracle JDK

1,Installing OpenJDK

1
2
3
sudo apt-get update
sudo apt-get install openjdk-8-jre
java -version

2,Installing Oracle Java 8

1
2
3
4
sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
sudo apt-get -y install oracle-java8-installer
java -version

 

二,下载安装Elasticsearch

不使用官网的版本,提供原始的插件不多.

用elasticsearc-rtf

在github搜索,中文发行版,已经安装了很多插件

https://github.com/medcl/elasticsearch-rtf

运行elasticsearch的方法,在bin文件目录下进入命令行,执行elasticsearch.bat

三:配置

配置文件:elasticsearch-rtf\elasticsearch-rtf-master\config\elasticsearch.yml

 

1503282472-3858-1779926-84340c76287bd524

四. elasticsearch两个重要插件:head和kibana的安装

head插件相当于Navicat,用于管理数据库,基于浏览器

https://github.com/mobz/elasticsearch-head

1
2
3
4
5
6
7
8
9
10
11
Running with built in server

git clone git://github.com/mobz/elasticsearch-head.git

cd elasticsearch-head

npm install

npm run start

open http://localhost:9100/

 

配置elasticsearch与heade互通

1503282473-9417-1779926-45b0ab9d1030c91c

kibana.bat

1503282474-1190-1779926-f7ba853e61e8b637

###

五. elasticsearch基础概念

  1. 集群:一个或多个节点组织在一起
  2. 节点:一个集群中的一台服务器
  3. 分片:索引划分为多份的能力,允许水平分割,扩展容量,多个分片响应请求
  4. 副本:分片的一份或多分,一个节点失败,其他节点顶上
    |index | 数据库|
    |type | 表|
    |document | 行|
    |fields | 列|

集合搜索和保存:增加了五种方法:
OPTIONS & PUT & DELETE & TRACE & CONNECT

3. 倒排索引:

1503282473-1175-1779926-a2d90a6f90511675

1503282473-1533-1779926-e61a277016449a3b

倒排索引待解决的问题:

1503282473-1487-1779926-e61a277016449a3b

1503282473-7871-1779926-b39e996d99c70d2e

1503282474-5249-1779926-1604a12ed995ea8d

###

4. elasticsearch命令

PUT lagou/job/1
1为id

PUT lagou/job/
不指明id自动生成uuid。

修改部分字段
POST lagou/job/1/_update

DELETE lagou/job/1
elasticserach批量操作:

查询index为testdb下的job1表的id为1和job2表的id为2的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
`<span class="hljs-keyword">GET</span> _mget
{
<span class="hljs-string">"docs"</span>:[
{
<span class="hljs-string">"_index"</span>:<span class="hljs-string">"testdb"</span>,
<span class="hljs-string">"_type"</span>:<span class="hljs-string">"job1"</span>,
<span class="hljs-string">"_id"</span>:<span class="hljs-number">1</span>
},
{
<span class="hljs-string">"_index"</span>:<span class="hljs-string">"testdb"</span>,
<span class="hljs-string">"_type"</span>:<span class="hljs-string">"job2"</span>,
<span class="hljs-string">"_id"</span>:<span class="hljs-number">2</span>
}
]
}`

index已经指定了,所有在doc中就不用指定了

1
2
3
4
5
6
7
8
9
10
11
12
`<span class="hljs-keyword">GET</span> testdb/_mget{
<span class="hljs-string">"docs"</span>:[
{
<span class="hljs-string">"_type"</span>:<span class="hljs-string">"job1"</span>,
<span class="hljs-string">"_id"</span>:<span class="hljs-number">1</span>
},
{
<span class="hljs-string">"_type"</span>:<span class="hljs-string">"job2"</span>,
<span class="hljs-string">"_id"</span>:<span class="hljs-number">2</span>
}
]
}`

连type都一样,只是id不一样

1
2
3
4
5
6
7
8
9
10
11
`<span class="hljs-keyword">GET</span> testdb/job1/_megt
{
<span class="hljs-string">"docs"</span>:[
{
<span class="hljs-string">"_id"</span>:<span class="hljs-number">1</span>
},
{
<span class="hljs-string">"_id"</span>:<span class="hljs-number">2</span>
}
]
}`

或者继续简写

1
2
3
4
`<span class="hljs-keyword">GET</span> testdb/job1/_megt
{
<span class="hljs-string">"ids"</span>:[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>]
}`

elasticsearch的bulk批量操作:可以合并多个操作,比如index,delete,update,create等等,包括从一个索引到另一个索引:

  • action_and_meta_data\n
  • option_source\n
  • action_and_meta_data\n
  • option_source\n
  • ….
  • action_and_meta_data\n
  • option_source\n
    每个操作都是由两行构成,除了delete除外,由元信息行和数据行组成
    注意数据不能美化,即只能是两行的形式,而不能是经过解析的标准的json排列形式,否则会报错
    1
    2
    3
    `POST _bulk
    {<span class="hljs-string">"index"</span>:<span class="hljs-keyword">...</span>}
    {<span class="hljs-string">"field"</span>:<span class="hljs-keyword">...</span>}`

elasticserach的mapping映射

elasticserach的mapping映射:创建索引时,可以预先定义字段的类型以及相关属性,每个字段定义一种类型,属性比mysql里面丰富,前面没有传入,因为elasticsearch会根据json源数据来猜测是什么基础类型。M挨批评就是我们自己定义的字段的数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索。
作用:会让索引建立的更加细致和完善,对于大多数是不需要我们自己定义
相关属性的配置

  • String类型: 两种text keyword。text会对内部的内容进行分析,索引,进行倒排索引等,为设置为keyword则会当成字符串,不会被分析,只能完全匹配才能找到String。 在es5已经被废弃了
  • 日期类型:date 以及datetime等
  • 数据类型:integer long double等等
  • bool类型
  • binary类型
  • 复杂类型:object nested
  • geo类型:geo-point地理位置
  • 专业类型:ip competition
  • object :json里面内置的还有下层{}的对象
  • nested:数组形式的数据

elasticserach查询:

大概分为三类:

  • 基本查询:
  • 组合查询:
  • 过滤:查询同时,通过filter条件在不影响打分的情况下筛选数据
    match查询:

    后面为关键词,关于python的都会提取出来,match查询会对内容进行分词,并且会自动对传入的关键词进行大小写转换,内置ik分词器会进行切分,如python网站,只要搜到存在的任何一部分,都会返回
    GET lagou/job/_search

    1
    2
    3
    4
    5
    6
    7
    `{
    "<span class="hljs-attribute">query</span>":<span class="hljs-value">{
    "<span class="hljs-attribute">match</span>":{
    "<span class="hljs-attribute">title</span>":<span class="hljs-string">"python"</span>
    }
    }
    </span>}`

term查询

区别,对传入的值不会做任何处理,就像keyword,只能查包含整个传入的内容的,一部分也不行,只能完全匹配
terms查询
title里传入多个值,只要有一个匹配,就会返回结果
控制查询的返回数量

1
2
3
4
5
6
7
8
9
10
`<span class="hljs-keyword">GET</span> lagou/_serach
{
<span class="hljs-string">"query"</span>:{
<span class="hljs-string">"match"</span>:{
<span class="hljs-string">"title"</span>:<span class="hljs-string">"python"</span>
}
},
<span class="hljs-string">"form"</span>:<span class="hljs-number">1</span>,
<span class="hljs-string">"size"</span>:<span class="hljs-number">2</span>
}`

通过这里就可以完成分页处理洛,从第一条开始查询两条

match_all 返回所有
GET lagou/_search
{
“query”:{
“match_all”:{}
}
}

match_phrase查询 短语查询

1
2
3
4
5
6
7
8
9
10
11
`<span class="hljs-keyword">GET</span> lagou/_search
{
<span class="hljs-string">"query"</span>:{
<span class="hljs-string">"match_phrase"</span>:{
<span class="hljs-string">"title"</span>:{
<span class="hljs-string">"query"</span>:<span class="hljs-string">"python系统"</span>,
<span class="hljs-string">"slop"</span>:<span class="hljs-number">6</span>
}
}
}
}`

python系统,将其分词,分为词条,满足词条里面的所有词才会返回结果,slop参数说明两个词条之间的最小距离

multi_match查询

比如可以指定多个字段,比如查询title和desc这两个字段包含python的关键词文档

1
2
3
4
5
6
7
8
9
`<span class="hljs-keyword">GET</span> lagou/_search
{
<span class="hljs-string">"query"</span>:{
<span class="hljs-string">"multi_match"</span>:{
<span class="hljs-string">"query"</span>:<span class="hljs-string">"python"</span>,
<span class="hljs-string">"fileds"</span>:[<span class="hljs-string">"title^3"</span>,<span class="hljs-string">"desc"</span>]
}
}
}`

query为要查询的关键词 fileds在哪些字段里查询关键词,只要其中某个字段中出现了都返回
^3的意思为设置权重,在title中找到的权值为在desc字段中找到的权值的三倍
指定返回字段

1
2
3
4
5
6
7
8
`<span class="hljs-keyword">GET</span> lagou/_search{
<span class="hljs-string">"stored_fields"</span>:[<span class="hljs-string">"title"</span>,<span class="hljs-string">"company_name"</span>],
<span class="hljs-string">"query"</span>:{
<span class="hljs-string">"match"</span>:{
<span class="hljs-string">"title"</span>:<span class="hljs-string">"pyhton"</span>
}
}
}`

通过sort把结果排序

1
2
3
4
5
6
7
8
9
10
11
12
`<span class="hljs-keyword">GET</span> lagou/_search
{
<span class="hljs-string">"query"</span>;{
<span class="hljs-string">"match_all"</span>:{}
},
<span class="hljs-string">"sort"</span>:[{
<span class="hljs-string">"comments"</span>:{
<span class="hljs-string">"order"</span>:<span class="hljs-string">"desc"</span>
}
}]
}
`

sort是一个数组,里面是一个字典,key就是要sort的字段,asc desc是升序降序的意思

查询范围 range查询
GET lagou/_search
{
“query”;{
“range”:{
“comments”:{
“gte”:10,
“lte”:20,
“boost”:2.0
}
}
}
}

range是在query里面的,boost是权重,gte lte是大于等于 小于等于的意思
对时间的范围查询,则是以字符串的形式传入
wildcard模糊查询,可以使用通配符
*

组合查询:bool查询

bool查询包括了must should must_not filter来完成
格式如下:

1
2
3
4
5
6
7
`<span class="hljs-symbol">bool:</span>{
<span class="hljs-string">"filter"</span><span class="hljs-symbol">:[]</span>,
<span class="hljs-string">"must"</span><span class="hljs-symbol">:[]</span>,
<span class="hljs-string">"should"</span><span class="hljs-symbol">:[]</span>,
<span class="hljs-string">"must_not"</span><span class="hljs-symbol">:[]</span>,
}
`

4. 把爬取的数据保存至elasticsearch

1
2
3
4
5
6
7
8
`<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ElasticsearchPipeline</span><span class="hljs-params">(object)</span>:</span>
<span class="hljs-comment">#将数据写入到es中</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process_item</span><span class="hljs-params">(self, item, spider)</span>:</span>
<span class="hljs-comment">#将item转换为es的数据</span>
item.save_to_es()

<span class="hljs-keyword">return</span> item`

elasticsearch-dsl-py

High level Python client for Elasticsearch
pip install elasticsearch-dsl

items.py 中将数据保存至es

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
` <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">save_to_es</span><span class="hljs-params">(self)</span>:</span>
article = ArticleType()
article.title = self[<span class="hljs-string">'title'</span>]
article.create_date = self[<span class="hljs-string">"create_date"</span>]
article.content = remove_tags(self[<span class="hljs-string">"content"</span>])
article.front_image_url = self[<span class="hljs-string">"front_image_url"</span>]
<span class="hljs-keyword">if</span> <span class="hljs-string">"front_image_path"</span> <span class="hljs-keyword">in</span> self:
article.front_image_path = self[<span class="hljs-string">"front_image_path"</span>]
article.praise_nums = self[<span class="hljs-string">"praise_nums"</span>]
article.fav_nums = self[<span class="hljs-string">"fav_nums"</span>]
article.comment_nums = self[<span class="hljs-string">"comment_nums"</span>]
article.url = self[<span class="hljs-string">"url"</span>]
article.tags = self[<span class="hljs-string">"tags"</span>]
article.meta.id = self[<span class="hljs-string">"url_object_id"</span>]

article.suggest = gen_suggests(ArticleType._doc_type.index, ((article.title,<span class="hljs-number">10</span>),(article.tags, <span class="hljs-number">7</span>)))

article.save()

redis_cli.incr(<span class="hljs-string">"jobbole_count"</span>)

<span class="hljs-keyword">return</span>`

5. elasticsearch结合django搭建搜索引擎

获取elasticsearch的查询接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
` body={
<span class="hljs-string">"query"</span>:{
<span class="hljs-string">"multi_match"</span>:{
<span class="hljs-string">"query"</span>:key_words,
<span class="hljs-string">"fields"</span>:[<span class="hljs-string">"tags"</span>, <span class="hljs-string">"title"</span>, <span class="hljs-string">"content"</span>]
}
},
<span class="hljs-string">"from"</span>:(page-<span class="hljs-number">1</span>)*<span class="hljs-number">10</span>,
<span class="hljs-string">"size"</span>:<span class="hljs-number">10</span>,
<span class="hljs-string">"highlight"</span>: {
<span class="hljs-string">"pre_tags"</span>: [<span class="hljs-string">'<span class="keyWord">'</span>],
<span class="hljs-string">"post_tags"</span>: [<span class="hljs-string">'</span>'</span>],
<span class="hljs-string">"fields"</span>: {
<span class="hljs-string">"title"</span>: {},
<span class="hljs-string">"content"</span>: {},
}
}
}`

使django与其交互。

1503282474-8288-1779926-1c550de187cbf9f6

1503282474-4131-1779926-9608d37c848236d9

 

坚持原创技术分享,您的支持将鼓励我继续创作!