首页 > 代码库 > elasticsearch搜索类型简单介绍

elasticsearch搜索类型简单介绍

简单搜索

GET请求很easy——你能轻松获取你想要的文档。让我们来进一步尝试一些东西。比方简单的搜索!

我们尝试一个最简单的搜索所有员工的请求:

GET /megacorp/employee/_search

接下来。让我们搜索姓氏中包括“jake”的员工。

要做到这一点,我们将在命令行中使用轻量级的搜索方法。

这样的方法常被称作查询字符串(query string)搜索。由于我们像传递URL參数一样去传递查询语句:

GET /megacorp/employee/_search?

q=last_name:jake

我们在请求中依然使用_searchkeyword,然后将查询语句传递给參数q=。这样就能够得到全部姓氏为jake的结果。

使用DSL语句查询

查询字符串搜索便于通过命令行完毕特定(ad hoc)的搜索,可是它也有局限性(參阅简单搜索章节)。Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它同意你构建更加复杂、强大的查询。

DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。我们能够这样表示之前关于“jake”的查询:

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "jake"
        }
    }
}

这会返回与之前查询同样的结果。

你能够看到有些东西改变了,我们不再使用查询字符串(query string)做为參数。而是使用请求体取代。这个请求体使用JSON表示。当中使用了match语句(查询类型之中的一个。详细我们以后会学到)。



更复杂的搜索

我们让搜索略微再变的复杂一些。我们依然想要找到姓氏为“jake”的员工。可是我们仅仅想得到年龄大于30岁的员工。

我们的语句将加入过滤器(filter),它使得我们高效率的运行一个结构化搜索:

GET /megacorp/employee/_search
{
    "query" : {
        "filtered" : {
            "filter" : {
                "range" : {
                    "age" : { "gt" : 30 } <1>
                }
            },
            "query" : {
                "match" : {
                    "last_name" : "jake" <2>
                }
            }
        }
    }
}
  • <1> 这部分查询属于区间过滤器(range filter),它用于查找全部年龄大于30岁的数据——gt为"greater than"的缩写。
  • <2> 这部分查询与之前的match语句(query)一致。

短语搜索

眼下我们能够在字段中搜索单独的一个词,这挺好的,可是有时候你想要确切的匹配若干个单词或者短语(phrases)。比如我们想要查询同一时候包括"rock"和"climbing"(而且是相邻的)的员工记录。

要做到这个,我们仅仅要将match查询变更为match_phrase查询就可以:

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}

高亮我们的搜索

非常多应用喜欢从每一个搜索结果中高亮(highlight)匹配到的keyword,这样用户能够知道为什么这些文档和查询相匹配。在Elasticsearch中高亮片段是非常easy的。

让我们在之前的语句上添加highlight參数。

当我们执行这个语句时,会命中与之前同样的结果,可是在返回结果中会有一个新的部分叫做highlight,这里包括了来自about字段中的文本。而且用<em></em>来标识匹配到的单词。

ps: web怎样做高亮显示,能够參考:http://www.w3school.com.cn/tags/tag_phrase_elements.asp

elasticsearch搜索类型简单介绍