Elasticsearch学习笔记1

启动es:

/bin/elasticsearch

浏览器访问: http://localhost:9400/_count?pretty请求文档数量,?pretty表示格式化输出

一个 Elasticsearch 集群可以 包含多个索引 ,相应的每个索引可以包含多个类型。 这些不同的类型存储着多个文档 ,每个文档又有多个属性

索引(名词):

如前所述,一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。

索引(动词):

索引一个文档 就是存储一个文档到一个 索引 (名词)中以便它可以被检索和查询到。这非常类似于 SQL 语句中的 INSERT 关键词,除了文档已存在时新文档会替换就文档情况之外。

倒排索引:

关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。

一个文档必须包含三个元数据:

_index 索引
_type 对象类别
_id 文档标识

文档增删改查

增加

POST http://localhost:9400/megacorp/employee/1
{
	"first_name" :  "Douglas",
	"last_name" :   "Fir",
   	"age" :         35,
    "about":        "I like to build cabinets",
    "interests":  [ "forestry" ]
}

如果指定的ID的文档已经存在的话,将会覆盖这个ID的文档数据

如果数据没有自然的ID,ElasticSearch可以自动生成ID,这时应该如下增加数据:

POST http://localhost:9400/megacorp/employee/
{
  "title": "My second blog entry",
  "text":  "Still trying this out...",
  "date":  "2014/01/01"
}

如果想在对应的ID不存在时才进行索引文档的话,增加_create或者设置op_type为create如下操作:

POST http://localhost:9400/megacorp/employee/1/_create 
 or 
POST http://localhost:9400/megacorp/employee/1/_create?op_type=create

修改

同创建时的PUT方法,增加_update表示更新文档一部分 可以增加?version参数进行并发下的冲突处理

扫描二维码关注公众号,回复: 620144 查看本文章
POST /website/blog/1/_update
{
	"doc" : {
      "tags" : [ "testing" ],
	  "views": 0
   }
}

删除

DELETE http://localhost:9400/megacorp/employee/1

查找

GET http://localhost:9400/megacorp/employee/_search

搜索

检查文档是否存在

HEAD /megacorp/employee/1

Query-string搜索

GET /megacorp/employee/_search

返回结果放在数组 hits 中。一个搜索默认返回十条结果。

可以将简单的搜索条件放到url中:

GET http://localhost:9400/megacorp/employee/_search?q=first_name:John

查询表达式

简单查询

GET /megacorp/employee/_search
{
	"query" : {
    	"match" : {
        	"last_name" : "Smith"
        }
	}
}

增加过滤查询

GET /megacorp/employee/_search
{
	"query" : {
    	"bool": {
        	"must": {
            	"match" : {
               	 "last_name" : "smith" 
	            }
            },
    	    "filter": {
        	    "range" : {
            	    "age" : { "gt" : 30 } 
                }	
	        }
    	}
    }
}		

短语匹配match_phrasematch的区别:match_phrase会明确匹配查询的条件,不会进行分词查询,match会分词查询

高亮查询

查询结果会在句子中匹配的词组增加<em>标签包裹,

详细高亮查询:高亮查询

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}

查询可以指定timeout时间

GET /_search?timeout=10ms

查询分页

GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10

在分布式系统中深度分页

理解为什么深度分页是有问题的,我们可以假设在一个有 5 个主分片的索引中搜索。 当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点 ,协调节点对 50 个结果排序得到全部结果的前 10 个。

现在假设我们请求第 1000 页--结果从 10001 到 10010 。所有都以相同的方式工作除了每个分片不得不产生前10010个结果以外。 然后协调节点对全部 50050 个结果排序最后丢弃掉这些结果中的 50040 个结果。

可以看到,在分布式系统中,对结果排序的成本随分页的深度成指数上升。这就是 web 搜索引擎对任何查询都不要返回超过 1000 个结果的原因。

猜你喜欢

转载自my.oschina.net/u/2299936/blog/1560391