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
  • logstash-input-jdbc插件实现mysql增量导入ES