共计 4422 个字符,预计需要花费 12 分钟才能阅读完成。
我的 Elasticsearch 系列文章,逐渐更新中,欢迎关注
0A. 关于 Elasticsearch 及实例应用
00.Solr 与 ElasticSearch 对比
01.ElasticSearch 能做什么?
02.Elastic Stack 功能介绍
03. 如何安装与设置 Elasticsearch API
04. 如果通过 elasticsearch 的 head 插件建立索引_CRUD 操作
05.Elasticsearch 多个实例和 head plugin 使用介绍
06. 当 Elasticsearch 进行文档索引时,它是如何工作的?
07.Elasticsearch 中的映射方式—简洁版教程
08.Elasticsearch 中的分析和分析器应用方式
09.Elasticsearch 中构建自定义分析器
10.Kibana 科普 - 作为 Elasticsearhc 开发工具
11.Elasticsearch 查询方法
12.Elasticsearch 全文查询
另外 Elasticsearch 入门,我强烈推荐 ElasticSearch 搭建小白指南给你,非常想尽的入门指南手册。
我们已经学习了 Elasticsearch 查询的基本分类,这两个类别的基本知识以及查询 / 过滤器上下文。在此博客中,其目的是向您介绍 Elasticsearch 世界中常见的全文查询。
让我们索引一些主要由一些文本组成的数据。为简单起见,我采用了 Facebook 帖子的修剪版本及其说明和详细信息的 CSV,这些内容可以在公共网站上获得。您可以将这些 tweet 索引到 Elasticsearch
我已将上述推文索引到名为 fb-post 的索引。索引后的样本数据文档如下所示:
{
"_index" : "fb-post",
"_type" : "_doc",
"_id" : "TszxwG0Bm6hFGbtHjVCC",
"_score" : 1.0,
"_source" : {
"status_type" : "shared_story",
"link" : "http://abcnews.go.com/blogs/headlines/2011/12/chief-justice-roberts-responds-to-judicial-ethics-critics/",
"description" : "PAUL J. RICHARDS/AFP/Getty Images Chief Justice John Roberts issued a ringing endorsement Saturday night of his colleagues’ability to determine when they should step down from a case because of a conflict of interest.“I have complete confidence in the capability of my colleagues to determine when ...",
"caption" : "abcnews.go.com",
"love_count" : 0,
"shares_count" : 12,
"page_id" : 86680728811,
"wow_count" : 0,
"post_type" : "link",
"id" : "86680728811_272953252761568",
"posted_at" : "2012-01-01 00:30:26",
"sad_count" : 0,
"angry_count" : 0,
"message" : "Roberts took the unusual step of devoting the majority of his annual report to the issue of judicial ethics.",
"picture" : "https://external.xx.fbcdn.net/safe_image.php?d=AQAPXteeHLT2K7Rb&w=130&h=130&url=http%3A%2F%2Fabcnews.go.com%2Fimages%2FPolitics%2Fgty_chief_justice_john_roberts_jt_111231_wblog.jpg&cfs=1&sx=108&sy=0&sw=269&sh=269",
"likes_count" : 61,
"thankful_count" : 0,
"@timestamp" : "2012-01-01T00:30:26.000+05:30",
"comments_count" : 27,
"name" : "Chief Justice Roberts Responds to Judicial Ethics Critics",
"haha_count" : 0
}
}
在上面的文档中,我们感兴趣的字段是诸如“名称”,“消息”和“描述”之类的文本字段。
现在让我们一个接一个地转到每个全文查询。
1. 匹配查询
我们在之前的博客中讨论了匹配查询,但是没有提到匹配查询的正常用例。匹配查询最常见的用例是当我们拥有大量数据集时,我们需要快速找到一些近似精确的匹配项。
例如,在我们的 Twitter 数据集中,我们需要确定整个推文集中是否存在“信心”一词。可以使用针对以下“文本”字段的简单匹配查询来完成此操作:
POST fb-post/_search
{
"query": {
"match": {
"description": {"query":"confidence"}
}
}
}
结果将显示带有“confidence”文本的推文。
现在在上面的示例中,我们只看到了一个单词。当我们输入多个单词时会发生什么?让我们尝试下面的查询,这里我们要给出的查询是“信心大厦”
POST fb-post/_search
{
"query": {
"match": {
"description": {"query":"confidence buildings"}
}
}
}
现在,这将返回匹配“信心”或“建筑物”的文档。匹配查询的默认行为为 OR。这可以更改。如果我们要同时匹配“信心”和“建筑物”,则可以在查询中指定“operator”参数,如下所示:
POST fb-post/_search
{
"query": {
"match": {
"description": {
"query":"confidence buildings",
"operator":"AND"
}
}
}
}
上面的查询将返回包含“信心”和“建筑物”(在我们的数据集中为零)的文档
2. 多重比对查询
顾名思义,多匹配查询将在多个字段中搜索搜索关键字。假设我们有一个搜索关键字“Giffords family”,可以在“名称”和“描述”字段中进行搜索,则可以使用多重匹配查询。
POST fb-post/_search
{
"query": {
"multi_match" : {
"query": "Giffords family",
"fields": ["name", "description"]
}
}
}
在此处,针对“名称”和“描述”字段搜索“Giffords”或“family”一词,并返回匹配的文档。
我们还可以针对特定字段进行自定义评分。在下面的查询中,对所有与“名称”字段中的关键字匹配的文档给予 5 的提升
POST fb-post/_search
{
"query": {
"multi_match" : {
"query": "Giffords family",
"fields": ["name^5", "description"]
}
}
}
- query_string 查询
另一个有用的查询是 query_string 查询。它与匹配查询类似,但此处搜索关键字的格式很重要。它需要特定的格式,并且如果搜索关键字的格式不同,则会返回错误。
考虑以下查询:
POST fb-post/_search
{
"query": {
"query_string" : {"query" : "(step down) OR (official act)"
}
}
}
在此,搜索关键字首先分为两部分,即“或”条件的左侧和“或”条件的右侧。也就是说,搜索查询中的运算符用作定界符。然后将对每个部分进行分析(根据要查询的字段,在上面的示例中查询所有字段,它将进行标准分析),然后进行查询。
也可以对特定的一个或多个字段进行查询,如下所示:
POST fb-post/_search
{
"query": {
"query_string" : {"query" : "(step down) OR (official act)",
"fields" : ["description","name"]
}
}
}
- match_phrase 查询
Match_phrase 查询是一个特别有用的查询,它寻找匹配短语而不是单个单词。在下面给出的示例中,match_phrase 查询以相同顺序获取与单词“deeply 关心”匹配的文档。
POST fb-post / _search
{“query”:{“match_phrase”:{“description”:“密切关注”}
}
}
即使更改了单词顺序,match_phrase 查询的一个非常有用的自定义设置也会匹配。例如,如果我们希望“深切关注”和“深切关注”相匹配,则可以将 slop 参数与 match_phrase 查询一起使用,如下所示:
POST fb-post/_search
{
"query": {
"match_phrase" : {"description" : "deeply concerned"}
}
}
slope 值默认为 0,最大范围为 50。在上面的示例中,slope 值 2 表示可以将这些词视为匹配项的范围。
现在考虑以下查询,在该查询的末尾加上不完整的关键字“ab”。该 match_phrase 查询没有提供火柴,即使存在具有“深切关注文档此查询有关”短语中的“描述”字段
POST fb-post/_search
{
"query": {
"match_phrase": {
"description" : {
"query" : "deeply concerned",
"slop": 2
}
}
}
}
- match_phrase_prefix 查询
在上面的示例中,我们看到 match_phrase 查询需要精确的短语来进行匹配。但是有时候,如果我们也可以使用 match_phrase_prefix 查询来匹配部分匹配项,那将很方便。“match_phrase_prefix”查询可帮助我们实现此类匹配。
POST fb-post/_search
{
"query": {
"match_phrase" : {"description" : "deeply concerned ab"}
}
}
上面的查询可以像下面搭配词组:
“deeply concerned about”
“deeply concerned above”
一个实际的用例是邮政编码的自动完成实现,其中用户键入部分短语。
结论
在此博客中,我们看到了 Elasticsearch 查询世界中的一些重要的全文查询。我将在下一个博客中介绍术语级别查询,然后再返回一些特殊的全文查询,这将有助于更好地理解。