ElasticSearch开始(3)–搜索
!!!因为看的中文文档是ElasticSearch 2.X,所以很多API、属性都过时了,此处只用于基本的入门,最新的API看官方英文文档!
2018.10.18
映射(Mapping):描述数据在每个字段内如何存储.
分析(Analysis):全文是如何处理使之可以被搜索的.
领域特定查询语言(Query DSL):es的强大查询语言.
空搜索
GET /_search //返回集群中所有索引下的所有文档
hits
它包含 total字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。
took
执行整个搜索请求耗费了多少毫秒
shards
在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。
timeout
查询是否超时
多索引、多类型
/_search
在所有的索引中搜索所有的类型
/gb/_search
//在 gb 索引中搜索所有的类型
/gb,us/_search
//在 gb 和 us 索引中搜索所有的文档
/g*,u*/_search
//在任何以 g 或者 u 开头的索引中搜索所有的类型
/gb/user/_search
//在 gb 索引中搜索 user 类型
/gb,us/user,tweet/_search
//在 gb 和 us 索引中搜索 user 和 tweet 类型
/_all/user,tweet/_search
//在所有的索引中搜索 user 和 tweet 类型
##映射和分析
倒排索引
一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
!你只能搜索在索引中出现的词条,所以索引文本和查询字符串必须标准化为相同的格式。
分析与分析器
分析
首先,将一块文本分成适合于倒排索引的独立的词条,之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者recall.
分析器
以上工作由分析器完成。分析器实际上将三个功能封装到了一个包里:
- 字符过滤器.
字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成
and。 - 分词器. 字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
- Token过滤器.
词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像
a,and,the等无用词),或者增加词条(例如,像jump和leap这种同义词)
映射
映射定义了类型中的域,每个域的数据类型,以及Elasticsearch如何处理这些域。映射也用于配置与类型有关的元数据。
核心简单域类型
- 字符串: text,keyword(早已放弃string)
- 整数 : byte, short, integer, long
- 浮点数: float, double
- 布尔型: boolean
- 日期: date
查看映射
<API:_mapping>
GET {index}/_mapping/{type}
自定义域映射
- 全文字符串域和精确值字符串域的区别
- 使用特定语言分析器
- 优化域以适应部分匹配
- 指定自定义数据格式
- 其他
非string域:
{
“number_of_clicks":{
"type":"integer"
}
}
string域:
* text:适用于全文索引,即对全文进行分词,同时可以有index属性,true代表对该域进行索引,false代表不进行索引。
{"type":"text","index":true}
* keyword:适用于精确值,即不分词字段,搜索时只能完全匹配。
{"type":"keyword"}
创建新索引
PUT /gb ①
{
"mappings": {
"tweet" : {
"properties" : {
"tweet" : {
"type" : "string",
"analyzer": "english"
},
"date" : {
"type" : "date"
},
"name" : {
"type" : "string"
},
"user_id" : {
"type" : "long"
}
}
}
}
}
①:通过消息体中指定的 mappings 创建了索引。
新增一个文本域:
PUT /gb/_mapping/tweet
{
"properties" : {
"tag" : {
"type" : "string",
"index": "not_analyzed"
}
}
}
复杂核心域
内部对象的映射
{
"gb": {
"tweet": { ①
"properties": {
"tweet": { "type": "text" },
"user": { ②
"type": "object",
"properties": {
"id": { "type": "text" },
"gender": { "type": "text" },
"age": { "type": "long" },
"name": { ③
"type": "object",
"properties": {
"full": { "type": "text" },
"first": { "type": "text" },
"last": { "type": "text" }
}
}
}
}
}
}
}
}
①:根对象
②③:内部对象
//type映射只是一种特殊的 对象 映射,我们称之为 根对象 。除了它有一些文档元数据的特殊顶级域,例如 _source 和 _all 域,它和其他对象一样。