篇幅有限
完整内容及源码关注公众号:ReverseCode,发送 冲
_search解析
| 1 | GET /_search | 
took:整个搜索请求花费了多少毫秒
hits.total:本次搜索,返回了几条结果
hits.max_score:本次搜索的所有结果中,最大的相关度分数是多少,每一条document对于search的相关度,越相关,_score分数越大,排位越靠前
hits.hits:默认查询前10条数据,完整数据,_score降序排序
shards:shards fail的条件(primary和replica全部挂掉),不影响其他shard。默认情况下来说,一个搜索请求,会打到一个index的所有primary shard上去,当然了,每个primary shard都可能会有一个或多个replic shard,所以请求也可以到primary shard的其中一个replica shard上去。
timeout:默认无timeout,latency平衡completeness,手动指定timeout,timeout查询执行机制
timeout=10ms,timeout=1s,timeout=1m
GET /_search?timeout=10m

搜索模式解析
multi-index和multi-type搜索模式
| 1 | /_search:所有索引,所有type下的所有数据都搜索出来 | 

- exact value
2017-01-01,exact value,搜索的时候,必须输入2017-01-01,才能搜索出来,如果你输入一个01,是搜索不出来的
- full text
 (1)缩写 vs. 全程:cn vs. china
 (2)格式转化:like liked likes
 (3)大小写:Tom vs tom
 (4)同义词:like vs love
2017-01-01,2017 01 01,搜索2017,或者01,都可以搜索出来
china,搜索cn,也可以将china搜索出来
likes,搜索like,也可以将likes搜索出来
Tom,搜索tom,也可以将Tom搜索出来
like,搜索love,同义词,也可以将like搜索出来
就不是说单纯的只是匹配完整的一个值,而是可以对值进行拆分词语后(分词)进行匹配,也可以通过缩写、时态、大小写、同义词等进行匹配。
倒排索引
doc1:I really liked my small dogs, and I think my mom also liked them.
doc2:He never liked any dogs, so I hope that my mom will not expect me to liked him.
mother like little dog,不可能有任何结果
normalization,建立倒排索引的时候,会执行一个操作,也就是说对拆分出的各个单词进行相应的处理,以提升后面搜索的时候能够搜索到相关联的文档的概率,包括时态的转换,单复数的转换,同义词的转换,大小写的转换。
| word | doc1 | doc2 | 
|---|---|---|
| I | * | * | 
| really | * | |
| like | * | * | 
| my | * | * | 
| little | * | |
| dog | * | * | 
| and | * | |
| think | * | |
| mom | * | * | 
| also | * | |
| them | * | |
| He | * | |
| never | * | |
| any | * | |
| so | * | |
| hope | * | |
| that | * | |
| will | * | |
| not | * | |
| expect | * | |
| me | * | |
| to | * | |
| him | * | 
分词器
切分词语,normalization(提升recall召回率),将句子拆分成一个一个的单个的单词,同时对每个单词进行normalization(时态转换,单复数转换),分词器。
recall召回率:搜索的时候,增加能够搜索到的结果的数量
| 1 | character filter:在一段文本进行分词之前,先进行预处理,比如说最常见的就是,过滤html标签(<span>hello<span> --> hello),& --> and(I&you --> I and you) | 
内置分词器
Set the shape to semi-transparent by calling set_trans(5)
| 1 | standard analyzer:set, the, shape, to, semi, transparent, by, calling, set_trans, 5(默认的是standard) | 
分页搜索
es进行分页搜索
size,from
| 1 | GET /_search?size=10 | 
deep paging

query string
| 1 | GET /test_index/test_type/_search?q=test_field:test 包含 | 
es中的_all元数据,在建立索引的时候,我们插入一条document,它里面包含了多个field,此时,es会自动将多个field的值,全部用字符串的方式串联起来,变成一个长的字符串,作为_all field的值,同时建立索引,后面如果在搜索的时候,没有对某个field指定搜索,就默认搜索_all field,其中是包含了所有field的值的。
| 1 | { | 
jack 26 jack@sina.com guangzhou,作为这一条document的_all field的值,同时进行分词后建立对应的倒排索引
mapping
插入几条数据,让es自动为我们建立一个索引
| 1 | PUT /website/article/1 | 
dynamic mapping,自动为我们建立index,创建type,以及type对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等设置
| 1 | GET /website/_mapping/article | 
因为es自动建立mapping的时候,设置了不同的field不同的data type。不同的data type的分词、搜索等行为是不一样的。所以出现了_all field和post_date field的搜索表现完全不一样。


