1. elasticsearch里面的search_type:
The type of the search operation to perform.
It can be:
dfs_query_then_fetch,
dfs_query_and_fetch,
query_then_fetch,
query_and_fetch.
2.Scroll
search
请求返回一个单一的结果“页”,而 scroll
API 可以被用来检索大量的结果(甚至所有的结果).
为了使用 scroll,初始搜索请求应该在查询中指定 scroll
参数,这可以告诉 Elasticsearch 需要保持搜索的上下文环境多久。
curl -XGET 'localhost:9200/twitter/tweet/_search?scroll=1m' -d ' { "query": { "match" : { "title" : "elasticsearch" } } }
3.Nested object
考虑到在ES里面建立,删除和更新一个单一文本是原子性的,那么将相关实体保存在同一个文本里面是有意义的。
非Nested Object类型的嵌套数据会被flatten成类似以下格式:
{ "title": [ eggs, nest ], "body": [ making, money, work, your ], "tags": [ cash, shares ], "comments.name": [ alice, john, smith, white ], "comments.comment": [ article, great, like, more, please, this ], "comments.age": [ 28, 31 ], "comments.stars": [ 4, 5 ], "comments.date": [ 2014-09-01, 2014-10-22 ] }
所以进行以下查询时
{ "query": { "bool": { "must": [ { "match": { "name": "Alice" } }, { "match": { "age": 28 } } ] } } }
会出现交叉对象匹配现象——多个对象交叉匹配。
通过将comments字段映射为nested类型,而不是object类型,每一个nested object 将会作为一个隐藏的单独文本建立索引,就可以避免上述现象。
4._analyze, _explain和_search_shards
_analyze, _explain和_search_shards是Elasticsearch提供的3个辅助API,经常不为人所知和所用。_explain 用来帮助分析文档的relevance score是如何计算出来的;_search_shards则是用来分析某个搜索请求将会访问到哪些节点以及shard,这在性能调优的时候还是很有用的;而_analyze是Elasticsearch一个非常有用的API,它可以帮助你分析每一个field或者某个analyzer/tokenizer是如何分析和索引一段文字的。