ElasticSearch开始(3)


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.

分析器

以上工作由分析器完成。分析器实际上将三个功能封装到了一个包里:

  1. 字符过滤器. 字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and
  2. 分词器. 字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
  3. Token过滤器. 词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 aandthe 等无用词),或者增加词条(例如,像 jumpleap 这种同义词)

映射

映射定义了类型中的域,每个域的数据类型,以及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 域,它和其他对象一样。