es简述
ES 全称 **ElasticSearch** 是一种分布式全文搜索引擎,基于Lucene(全文搜索框架)开发而来。
ES 虽然是以Lucene核心库开发的,但是却不是以它作为核心,**ES** 的贴点体现在:
*分布式实时文件存储,每个字段皆能索引*
*集群,可扩展(理论上无上限)*
*高度集成的服务(RESTful风格的API,各语言客户端)*
composer require elasticsearch/elasticsearch 安装elasticsearch扩展
辅助管理工具Kibana5
默认访问地址:http://localhost:5601
菜单:
Discover:可视化查询分析器
Visualize:统计分析图表
Dashboard:自定义主面板(添加图表)
Timelion:Timelion是一个kibana时间序列展示组件(暂时不用)
Dev Tools :Console(同CURL/POSTER,操作ES代码工具,代码提示,很方便)
Management:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性
可以进行可视化获取
在堡垒机上可以通过命令行 :
curl -H "Content-Type: application/json" -X GET 'http://localhost:9200/myappname/
_search' -d '{"size":10,"from":0,"query":{"bool":{"must":{"match":{"title":{"query":"\u889c\u5b50"}}},"filter":{"term":{"onsale":true}}}},"sort":{"listorder":{"order":"desc"},"id":{"order":"desc"}}}'
基本查询
指定请求头
–header “content-Type:application/json”
es使用描述
es的类型和数据库是相对应的
索引——》数据库
类型——》数据表
id——》自增字段id(该字段一般只用于已知情况下)
1.几个基本名词
index: es里的index相当于一个数据库。
type: 相当于数据库里的一个表。
id: 唯一,相当于主键。
node:节点是es实例,一台机器可以运行多个实例,但是同一台机器上的实例在配置文件中要确保http和tcp端口不同(下面有讲)。
cluster:代表一个集群,集群中有多个节点,其中有一个会被选为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。
shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
上面这些都是在创建es文档的时候设置的
由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。
//查询字符串模式:同样是使用Kibana5
GET itsource/employee/_search?q=fullName:倪先华
DSL模式:
GET _index/type/id
例如下:
GET itsource/employee/_search
{
"query" : {
"match" : {
"fullName" : "倪先华"
}
}
}
使用DSL查询,必须要传递query参数给ES。
但是7.0之后版本,只用到了索引, type将会自动创建,现在可以看做一个文档一个索引。 创建和查询的时候不需要特意设置type
es搜索的操作类似于数据库的操作,也是增删改查
在dsl模式中 通过设置mapping 创建字段 post 插入修改 get获取
上面示例:可以视为
select * from itsource.employee where fullName like '%倪先华%' sql的模糊查询
当然 ES 这个也可以进行精确查询可以设置包含百分比,不同的就是es在创建的文档的时候会设置字段的分词器,进行分词查找
ik是一个中文切词插件,elasticSearch自带的中文切词很不专业,ik对中文切词支持的比较好。
例:
如果想检查ik的切词效果,可以执行:
1. curl 'http://localhost:9200/myappname/_analyze?analyzer=ik_max_word&pretty=true' -d'
2. {
3. "text":"中华人民共和国国歌"
4. }'
通过返回结果可以看出,ik_max_word切词把中华人民共和国国歌切成了
“中华人民共和国”、“中华人民”、“中华”、“华人”、“人民共和国”、“人民”、“共和国”、
“共和”、“国”、“国歌”
也就是说我们搜索这些词中的任意一个都能把这句话搜到,如果不安装ik插件的话,那只会切成:“中”、“华”、“人”、“民”、“共”、“和”、“国”、“国”、“歌”,不够智能,搜索也不好进行了
{
"tokens" : [
{
"token" : "there", // 分词
"start_offset" : 0, // 起始偏移量
"end_offset" : 5, // 结束偏移量
"type" : "<ALPHANUM>", // 分词的类型
"position" : 0 // 该分词在文本中的位置
},
{
"token" : "is",
"start_offset" : 6,
"end_offset" : 8,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "a",
"start_offset" : 11,
"end_offset" : 12,
"type" : "<ALPHANUM>",
"position" : 2
},
// 省略其他4项
]
}
因为es的操作都是json格式的,所以适应起来是非常方便的
在php中使用可以直接用数组对应也可以使用json转数组
$client = new EsClientService();
$client = $client->client();
$params = [
'index' => 'my_index',
'type' => 'my_type',
'body' => [
'query' => [
"match" => [ //分词模糊查询
"name" => "余付"
]
]
]
];
$rt = $client->search($params);
curl -H "Content-Type: application/json" -X GET 'http://x.x.x.x:XXXX/yg_goods_goods/_analyze/?pretty' -d '{ "analyzer": "ik_max_word", "text": "测试用例" }' 查看分词器的分词效果
注:1.es查询默认一次只会查询十条数据 这个可以通过设置修改
2.es在创建文档的时候要注意文档字段的设置(类型和分词器)会影响es的操作
3.es在使用"minimum_should_match":75%,可以配置一个一个百分比,至少optional clauses至少满足75%,这里是向下取整的。比如有5个clause,5*75%=3.75,向下取整为3,也就是至少需要match 3个clause。数字可以是负数,例如有4个term的匹配,当匹配度为-25%与75%,其意义是一样的,都是最少匹配三个,但处理5个term时,-25%表示至少匹配四个,而75%表示至少匹配三个term。
es同一次搜索请求获得不同结果
产生现象的原因
es中主副分片进行refresh过程是相互独立的,当批量持续写入数据时,主副分片中的数据不是严格一致的。 所以同个搜索多次执行的时候,在主副分片来回执行会导致结果“跳动”的情况。
使用preference参数指定搜索的分片就可以保证一次搜索只有一次结果。