BootstrapElasticsearch学习笔记

Wikipedia使用Elasticsearch作为全文检索的工具
GitHub使用Elasticsearch寻觅代码
货主助手使用Elasticsearch用于地方的混淆匹配,粤语与拼音的互转
基于Lucene,Elasticsearch之于SQL,Lucene就像RDBMS引擎
使用java编写
起步 ./bin/elasticsearch -d 后台方式
http://localhost:9200/?pretty 查看版本等为主消息
布局文件config/elasticsearch.yml
原生为集群形式,类似rocketmq和kafka
节点间使用9300通讯
呼吁格式'<PROTOCOL>://<HOST>/<PATH>?<QUE汉兰达Y_ST普拉多ING>’
-d ‘<BODY>’,BODY为JSON编码的请求体
Elasticsearch使用JSON作为种类化格式。
数据库和ES的附和关系如下:
Relational DB ⇒ Databases ⇒ Tables ⇒ Rows ⇒ Columns
Elasticsearch ⇒ Indices ⇒ Types ⇒ Documents ⇒ Fields
3个ES集群包括八个indices。index是2个逻辑命名空间,指向1个或七个shards,相当于oracle的segment。shard是Lucene的2个实例。Shards是Elasticsearch在集群内布满数据的单位。Elasticsearch会依照cluster的恢弘和收缩自动在节点间迁移shards。多个shard或许是primary或replica。那跟couchbase的集群处理形式是如出1辙的。暗中同意意况下,1个index中有六个primary
shards。
创造索引
PUT http://localhost:9200/blogs
{
“settings” : {
“number_of_shards” : 3,
“number_of_replicas” : 1
}
}
创设文书档案,用postman PUT http://localhost:9200/megacorp/employee/1 -d
‘{
“first_name” : “John”,
“last_name” : “Smith”,
“age” : 25,
“about” : “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}’
返回
{“_index”:”megacorp”,”_type”:”employee”,”_id”:”2″,”_version”:1,”result”:”created”,”_shards”:{“total”:2,”successful”:1,”failed”:0},”created”:true}
壹经未有设置ID,则ES会自动生成叁个。如:
{
“_index”: “megacorp”,
“_type”: “employee”,
“_id”: “1”,
“_version”: 13,
“result”: “updated”,
“_shards”: {
“total”: 2,
“successful”: 1,
“failed”: 0
},
“created”: false
}
_version代表更换的次数,一般的话,id不应有自动生成。
文书档案存款和储蓄在哪个shard中的公式如下:
shard = hash(routing) % number_of_primary_shards
routing默认是_id。
暗中同意意况下,replication=sync。默许情形下replica=一。
会自行创立index megacorp,注解类型为employee,编号为1
招来文书档案,
GET http://localhost:9200/megacorp/employee/1
存在
{“_index”:”megacorp”,”_type”:”employee”,”_id”:”1″,”_version”:1,”found”:true,”_source”:{
“first_name” : “John”,
“last_name” : “Smith”,
“age” : 25,
“about” : “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}}
_source中包含JSON原文档,
http://localhost:9200/megacorp/employee/111
不存在
{“_index”:”megacorp”,”_type”:”employee”,”_id”:”111″,”found”:false}
同时HTTP HEAD为404
询问钦点字段
GET http://localhost:9200/megacorp/employee/1?\_source=first\_name
{
“_index”: “megacorp”,
“_type”: “employee”,
“_id”: “1”,
“_version”: 13,
“found”: true,
“_source”: {
“first_name”: “John”
}
}

删除
DELETE http://localhost:9200/megacorp/employee/111
{“found”:true,”_index”:”megacorp”,”_type”:”employee”,”_id”:”1″,”_version”:2,”result”:”deleted”,”_shards”:{“total”:2,”successful”:1,”failed”:0}}

正确寻觅就从未有过须求运用ES了,所以模糊搜索才是首要。
/_search
{
“took”: 5,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“failed”: 0
},
“hits”: {
“total”: 5,
“max_score”: 1,
“hits”: [
{
“_index”: “megacorp”,
“_type”: “employee”,
“_id”: “AV3Kp7BqVnBASvmzDScd”,
“_score”: 1,
“_source”: {
“first_name”: “John”,
“last_name”: “Smith”,
“age”: 25,
“about”: “I love to go rock climbing”,
“interests”: [
“sports”,
“music”
]
}
},
{
“_index”: “megacorp”,
“_type”: “employee”,
“_id”: “2”,
“_score”: 1,
“_source”: {
“first_name”: “Jane”,
“last_name”: “Smith”,
“age”: 32,
“about”: “I like to collect rock albums”,
“interests”: [
“music”
]
}
},
{
“_index”: “megacorp”,
“_type”: “employee”,
“_id”: “AV3Kp5hsVnBASvmzDScc”,
“_score”: 1,
“_source”: {
“first_name”: “John”,
“last_name”: “Smith”,
“age”: 25,
“about”: “I love to go rock climbing”,
“interests”: [
“sports”,
“music”
]
}
},
{
“_index”: “megacorp”,
“_type”: “employee”,
“_id”: “1”,
“_score”: 1,
“_source”: {
“first_name”: “John”,
“last_name”: “Smith”,
“age”: 25,
“about”: “I love to go rock climbing”,
“interests”: [
“sports”,
“music”
]
}
},
{
“_index”: “megacorp”,
“_type”: “employee”,
“_id”: “3”,
“_score”: 1,
“_source”: {
“first_name”: “Douglas”,
“last_name”: “Fir”,
“age”: 35,
“about”: “I like to build cabinets”,
“interests”: [
“forestry”
]
}
}
]
}
}
私下认可情形下,hits重返符合条件的前方10行,_score从高到低。假如要分页,则供给丰盛:
http://localhost:9200/megacorp/employee/\_search?size=2&from=2
追寻全部字段,真正的全文字笔迹核算索
http://localhost:9200/megacorp/employee/\_search?q=John
在后台,其实是询问全体字段,内部有贰个饱含的_all字段,类型为string。
各样语法能够参见https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html\#query-string-syntax

type的组织(mapping/方式定义)
GET http://localhost:9200/megacorp/\_mapping/employee
{
“megacorp”: {
“mappings”: {
“employee”: {
“properties”: {
“about”: {
“type”: “text”,
“fields”: {
“keyword”: {
“type”: “keyword”,
“ignore_above”: 256
}
}
},
“age”: {
“type”: “long”
},
“first_name”: {
“type”: “text”,
“fields”: {
“keyword”: {
“type”: “keyword”,
“ignore_above”: 256
}
}
},
“interests”: {
“type”: “text”,
“fields”: {
“keyword”: {
“type”: “keyword”,
“ignore_above”: 256
}
},
“fielddata”: true
},
“last_name”: {
“type”: “text”,
“fields”: {
“keyword”: {
“type”: “keyword”,
“ignore_above”: 256
}
}
}
}
}
}
}
}
es会自动测算最合适的项目,比方text/long/date。实际上ES也是强类型语义的,假如long被不适宜的概念为string,在全文字笔迹核准索时将促成非预期的结果。除了暗许的定义外,田野先生可以自定义mapping属性,平常是index(用于调节某字段协理标准相称、模糊相配还是不扶助搜索)和analyzer(评释分析器)那七个天性。可是mapping不可能修改,只幸好开立刻或然新添字段时钦命。
Lucene不援助存款和储蓄null值。
到config文件夹下的elasticsearch.yml,在文书的尾声增添如下内容:
http.cors.enabled: true
http.cors.allow-origin: “*”
以便援助在web中经过ajax访问。
query DSL和filter
DSL差距:query用于全文字笔迹核实索并获得_score,filter用于标准匹配。
text有可信相称和全文字笔迹核准索的界别,long/date以及_id则没有。
Elasticsearch会为种种text 田野同志的每一种单词建立inverted index索引。
暗中认可情形下,ES区分轻重缓急写,复数与非负数,实际上我们期待她们不灵动。还有汉语的协作寻找。那种景况,大家供给采纳analyzer,暗中同意的分析器是正经分析器,它基于UNICODE
TEXT
SE奇霉素ENTATION进行剖析。ES原生帮忙的语言分析器包含https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html,其中不包括中文,所以默认每个汉字都是一个term。如果不希望某字段使用默认的分析器,必须通过在这些字段上声明mapping(也叫schema
definition,相当于ddl的意味)来手工业配置。
应用DSL语言作为查询条件的格式,也正是JSON格式。全体的询问结果都会回到贰个_score,表示十一分程度。

Fielddata is disabled on text fields by default. Set fielddata=true on
[interests] in order to load fielddata in memory by uninverting the
inverted index. Note that this can however use significant memory.
Alternatively use a keyword field instead.
消除方法:http://blog.csdn.net/u011403655/article/details/71107415
https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html
在cluster中,有1个节点被选为master节点,其承担集群内的全局管理,比方扩充/删除index、节点,可是不治本具体的业务。
查阅ES集群状态
GET http://localhost:9200/\_cluster/health
{
“cluster_name”: “elasticsearch”,
“status”: “yellow”,
“timed_out”: false,
“number_of_nodes”: 1,
“number_of_data_nodes”: 1,
“active_primary_shards”: 5,
“active_shards”: 5,
“relocating_shards”: 0,
“initializing_shards”: 0,
“unassigned_shards”: 5,
“delayed_unassigned_shards”: 0,
“number_of_pending_tasks”: 0,
“number_of_in_flight_fetch”: 0,
“task_max_waiting_in_queue_millis”: 0,
“active_shards_percent_as_number”: 50
}
最要害的是status字段
取值:
green
All primary and replica shards are active.
yellow
All primary shards are active, but not all replica shards are
active.(对于单节点的条件来说,replica shards未有怎么意思)
red
Not all primary shards are active.
运转第二个节点的时候,节点会自行进入一样名称的cluster.name集群。Elasticsearch可以在节点宕机后自动重新大选master
shard,这样就能够再一次提供服务了。
Elasticsearch中,文书档案中的每种字段都被索引了,叁个查询中。
元数据包涵:
_index:必须小写,不能够包涵逗号,不能够_开头
_type:每一种type都有和睦的形式定义大概叫做mapping
_id:唯一标志2个type内的文档

暗中认可意况下,ES基于相关性举办排序。假如要依附字段实行排序,则要钦赐如下:
GET /_search
{
“query” : {
“filtered” : {
“filter” : { “term” : { “user_id” : 1 }}
}
},
“sort”: { “date”: { “order”: “desc” }}
}
比方排序不是依靠相关性的话,_score不会被计算。计算_score的本钱极高,所以钦点了sort的话,暗中同意不会总括_score,指定track_scores=true能够强行计算。
多规格合作,首先依照date,其次依据相关性。
GET /_search
{
“query” : {
“filtered” : {
“query”: { “match”: { “tweet”: “manage text search” }},
“filter” : { “term” : { “user_id” : 2 }}
}
},
“sort”: [
{ “date”: { “order”: “desc” }},
{ “_score”: { “order”: “desc” }}
]
}

对于全文字笔迹核查索的字段,排序未有意义,一般用相关度。
ES会将尽量多的数量保存在内存中以狠抓质量。
ES的询问称为布满式寻找查询,分为查询和提取两片段。在查询阶段,请求会播放给具有的shard,重返符合条件的top
N,依据order by条件。
翻看indices层面包车型大巴事态
GET _cluster/health?level=indices
GET _cluster/health?level=shards
节点的情景:
http://localhost:9200/\_nodes/stats
种种JVM内部存款和储蓄器不要高出3二GB,最佳在30G以内,Elasticsearch和Lucene分别采用3/6的内部存款和储蓄器。前者选用JVM内部存储器,后者使用OS的filesystem
cache。可是只要这么布署来讲,为了确认保障HA,须要安装开始化参数cluster.routing.allocation.same_shard.host:true,幸免主和从shard分配到平等的机器。
集合是经过称为田野(field)data的数据结构达成的,Fielddata是Elasticsearch集群中内部存款和储蓄器的最大消耗者。所以必须完全知晓它。
Fielddata有点像福睿斯DBMS的数据块,只然则应该是作为单位的,会按需加载到内部存款和储蓄器。Fielddata存在的由来是因为inverted
indices不是银弹,inverted
indices擅长于找到包蕴某些分词(term)的文档,可是转头,在有些文书档案中留存如何个term就懵逼了,而聚合须要那种三回访问情势。

ES linux下安装
vi elasticsearch.yml
network.host: 0.0.0.0 不然唯有本机技艺访问
无法root用户实践
groupadd es
useradd -g es es
[2016-12-20T22:37:28,552][ERROR][o.e.b.Bootstrap ] [elk-node1]
node validation exception
bootstrap checks failed
消除:使用centos 7版本,就不会冒出此类主题材料了。
system call filters failed to install; check the logs and fix your
configuration or disable system call filters at your own risk
原因:
那是在因为Centos陆不补助SecComp,而ES5.二.0暗中同意bootstrap.system_call_filter为true进行质量评定,所以导致检验失利,失败后一向变成ES不能够开行。
解决:
在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory上边:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

vi /etc/security/limits.conf
累加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
vi /etc/sysctl.conf
增加上面配置:
vm.max_map_count=655360
并实践命令:
sysctl -p
接下来,重新起动elasticsearch,就能够运维成功。
elasticsearch-analysis-ik安装
拷贝到ES_HOME/plugins目录下,命名为ik即可
elasticsearch-analysis-pinyin安装
拷贝到ES_HOME/plugins目录下,命名为pinyin即可
elasticsearch-head的装置可见http://mobz.github.io/elasticsearch-head/,对于rhel
7/windows,符合规律。对于rhel
陆,安装相比较费心,越发是在nodejs和npm安装的时候,还要晋级gcc到4.捌,不然nodejs
v陆+装置不了,用0.陆.x则npmjs各样劳动。实际上也没怎么用,cli都能查到要求的新闻。

相关文章