ElasticSearch
- 倒排索引
命令(可以通过Kibana-Devtools-Console)
1、健康状态
GET /_cat/health?v
结果如下
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1509779009 15:03:29 elasticsearch yellow 1 1 1 1001 0 - 50.0%
2、查看索引
GET /_cat/indices?v
3、创建索引
PUT /test?pretty
4、删除索引
DELETE /test?pretty
5、新增文档并建立索引
语法为:
PUT /index/type/id
{
"json数据"
}
- index:指索引名
- type:指索引的类型
- id:是这条数据的id。
例如:(添加和修改是同一个请求)
PUT /goods/book/1
{
"name" : "深入理解java虚拟机",
"price" : 100
}
6、查询指定商品
GET /goods/book/1
7、删除指定商品
DELETE /goods/book/1
8、查询所有商品
GET /goods/book/_search
返回参数如下
- took:耗费了几毫秒
- timed_out:是否超时,这里是没有
- _shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以)
- hits.total:查询结果的数量,3个document
- hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
- hits.hits:包含了匹配搜索的document的详细数据
9、query sring search
GET /goods/book/_search?q=name:java&sort=price:desc
不建议使用。
10、query DSL(Domain Specified Language,特定领域的语言)
查询所有的商品
GET /goods/book/_search
{
"query": { "match_all": {} }
}
查询名称包含java的商品,同时按照价格降序排序
GET /goods/book/_search
{
"query" : {
"match" : {
"name" : "java"
}
},
"sort": [
{ "price": "desc" }
]
}
分页查询商品,总共3条商品,假设每页就显示1条商品,现在显示第2页,所以就查出来第2个商品
GET /goods/book/_search
{
"query": { "match_all": {} },
"from": 1,
"size": 1
}
指定要查询出来商品的名称和价格就可以
GET /goods/book/_search
{
"query": { "match_all": {} },
"_source": ["name", "price"]
}
11、query filter
搜索商品名称包含NB,而且售价大于300元的商品
GET /goods/book/_search
{
"query" : {
"bool" : {
"must" : {
"match" : {
"name" : "java"
}
},
"filter" : {
"range" : {
"price" : { "gt" : 300 }
}
}
}
}
}
12、full-text search(全文检索)
POST /goods/book/2
{
"name" : "c++",
"price" : 220
}
然后再来查询,name这个字段,会先被拆解,建立倒排索引 :
GET /shores/product/_search
{
"query" : {
"match" : {
"name" : "c++"
}
}
}
13、phrase search(短语搜索)
跟全文检索相对应,相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回 phrase search,要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回
GET /shores/product/_search
{
"query" : {
"match_phrase" : {
"name" : "java"
}
}
}
14、highlight search(高亮搜索结果)
GET /shores/product/_search
{
"query" : {
"match" : {
"name" : "java"
}
},
"highlight": {
"fields" : {
"name" : {}
}
}
}
状态
- green:每个索引的primary shard和replica shard都是active状态的
- yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
- red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了
document的核心元数据
1、_index元数据
- (1)代表一个document存放在哪个index中
- (2)类似的数据放在一个索引,非类似的数据放不同索引:product index(包含了所有的商品),sales index(包含了所有的商品销售数据),inventory index(包含了所有库存相关的数据)。如果你把比如product,sales,human resource(employee),全都放在一个大的index里面,比如说company index,不合适的。
- (3)index中包含了很多类似的document:类似是什么意思,其实指的就是说,这些document的fields很大一部分是相同的,你说你放了3个document,每个document的fields都完全不一样,这就不是类似了,就不太适合放到一个index里面去了。
- (4)索引名称必须是小写的,不能用下划线开头,不能包含逗号:product,website,blog
2、_type元数据
- (1)代表document属于index中的哪个类别(type)
- (2)一个索引通常会划分为多个type,逻辑上对index中有些许不同的几类数据进行分类:因为一批相同的数据,可能有很多相同的fields,但是还是可能会有一些轻微的不同,可能会有少数fields是不一样的,举个例子,就比如说,商品,可能划分为电子商品,生鲜商品,日化商品,等等。
- (3)type名称可以是大写或者小写,但是同时不能用下划线开头,不能包含逗号
3、_id元数据
- (1)代表document的唯一标识,与index和type一起,可以唯一标识和定位一个document
- (2)我们可以手动指定document的id(put /index/type/id),也可以不指定,由es自动为我们创建一个id
拓展
- ELK
- ElasticSearch
- Logstash
- Kibana