三 ElasticSearch的搜索功能以及esengine搜索的实现
在上期博客中,我们用elasticsearch为我们的博客建立了索引,为我们的框架提供了数据基础。这期博客中,我们将介绍elasticsearch中的核心功能——搜索,并实现框架中的单字段搜索以及多字段搜索功能。
在实现了框架中的搜索功能后,我们可以得到以下结果:
页面右上角出现了一个带有复选框的搜索表单,我们可以对多个字段进行搜索,图中是同时对标题和正文两个字段进行搜索。我们的搜索结果已分好页,且已被高亮显示。
elasticsearch提供两种搜索方式:URI搜索以及Request Body搜索。在URI搜索中,我们的搜索参数通过URI字符串传递给es。在这种搜索方式中,所有的参数都会暴露在外(类似于get方式),比较适合用cURL进行搜索测试;而Request Body方式适用于传递复杂的参数,使用ES提供的Query DSL语言进行各种复杂的搜索。在Request Body方式中,DSL语言以json的格式组织,并传递给ES,从而得到搜索结果。
我们先以ES文档中的一个Query DSL的范例来看一下这种json形式的搜索语言:
"query": {
"match" : {
"message" : "this is a test"
}
}
每个Query DSL都以query关键字作为开始,表示它是一个query表达式。第二层表明了搜索方式,在这里为match,而第三层的message为欲搜索的字段,"this is a test"则为搜索的内容。注意,以上所有的关键字以及搜索内容都要用双引号包起来。这句DSL可以理解为如下含义:查找message字段中含有this is a test内容的数据。
match只是搜索方式的一种。在我们的框架中,我们使用到了以下搜索方式:
match:在指定字段中搜索指定内容;
match_phrase_prefix:以指定的内容作为前缀对指定字段进行搜索。在我们的框架中,作为当match或multi_match方式搜索不到时的一种补充搜索方式;
multi_match:在多个字段中搜索同一个指定内容;
而ES会返回给我们以下内容,我们需要在其中解析出我们想要的数据:
{
"took": 1,
"timed_out": false,
"_shards":{
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits":{
"total" : 1,
"max_score": 1.3862944,
"hits" : [
{
"_index" : "twitte