前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >23个有用的Elasticsearch示例查询

23个有用的Elasticsearch示例查询

作者头像
February
发布于 2018-12-03 08:03:30
发布于 2018-12-03 08:03:30
9.9K00
代码可运行
举报
文章被收录于专栏:技术翻译技术翻译
运行总次数:0
代码可运行

为了说明Elasticsearch中的不同查询类型,我们将使用以下字段搜索书籍文档的集合:标题,作者,摘要,发布日期和评论数。

但首先,让我们使用批量API创建一个新索引并索引一些文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT /bookdb_index
    { "settings": { "number_of_shards": 1 }}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_bulk
    { "index": { "_id": 1 }}
    { "title": "Elasticsearch: The Definitive Guide", "authors": ["clinton gormley", "zachary tong"], "summary" : "A distibuted real-time search and analytics engine", "publish_date" : "2015-02-07", "num_reviews": 20, "publisher": "oreilly" }
    { "index": { "_id": 2 }}
    { "title": "Taming Text: How to Find, Organize, and Manipulate It", "authors": ["grant ingersoll", "thomas morton", "drew farris"], "summary" : "organize text using approaches such as full-text search, proper name recognition, clustering, tagging, information extraction, and summarization", "publish_date" : "2013-01-24", "num_reviews": 12, "publisher": "manning" }
    { "index": { "_id": 3 }}
    { "title": "Elasticsearch in Action", "authors": ["radu gheorge", "matthew lee hinman", "roy russo"], "summary" : "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms", "publish_date" : "2015-12-03", "num_reviews": 18, "publisher": "manning" }
    { "index": { "_id": 4 }}
    { "title": "Solr in Action", "authors": ["trey grainger", "timothy potter"], "summary" : "Compre

举例

基本匹配查询

有两种方法可以执行基本的全文(匹配)查询:使用Search Lite API,它希望所有搜索参数作为URL的一部分传入,或者使用完整的JSON请求体,允许您使用完整的Elasticsearch DSL。

这是一个基本匹配查询,用于在所有字段中搜索字符串“guide”:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /bookdb_index/book/_search?q=guide
[Results]
"hits": [
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "4",
    "_score": 1.3278645,
    "_source": {
      "title": "Solr in Action",
      "authors": [
        "trey grainger",
        "timothy potter"
      ],
      "summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
      "publish_date": "2014-04-05",
      "num_reviews": 23,
      "publisher": "manning"
    }
  },
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "1",
    "_score": 1.2871116,
    "_source": {
      "title": "Elasticsearch: The Definitive Guide",
      "authors": [
        "clinton gormley",
        "zachary tong"
      ],
      "summary": "A distibuted real-time search and analytics engine",
      "publish_date": "2015-02-07",
      "num_reviews": 20,
      "publisher": "oreilly"
    }
  }
]

此查询的精简版如下所示,并产生与上述搜索相同的结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "query": {
        "multi_match" : {
            "query" : "guide",
            "fields" : ["title", "authors", "summary", "publish_date", "num_reviews", "publisher"]
        }
    }
}

作为对多个字段运行相同查询的便捷缩写方式,multi_match关键字用于代替match关键字。fields 属性指定要查询的字段,在这种情况下,我们要查询文档中的所有字段。

注意:在ElasticSearch 6之前,您可以使用“ _all”字段在所有字段中查找匹配项,而不必指定每个字段。“ _all”字段的工作原理是将所有字段连接成一个大字段,使用空格作为分隔符,然后分析和索引字段。在ES6中,默认情况下已弃用和禁用此功能。如果您对创建自定义“ _all”字段感兴趣,ES6将提供“copy_to”参数。有关详细信息,请参阅ElasticSearch指南

SearchLite API还允许您指定要搜索的字段。例如,要在标题字段中搜索带有“in Action”字样的图书:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /bookdb_index/book/_search?q=title:in action
[Results]
"hits": [
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "3",
    "_score": 1.6323128,
    "_source": {
      "title": "Elasticsearch in Action",
      "authors": [
        "radu gheorge",
        "matthew lee hinman",
        "roy russo"
      ],
      "summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
      "publish_date": "2015-12-03",
      "num_reviews": 18,
      "publisher": "manning"
    }
  },
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "4",
    "_score": 1.6323128,
    "_source": {
      "title": "Solr in Action",
      "authors": [
        "trey grainger",
        "timothy potter"
      ],
      "summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
      "publish_date": "2014-04-05",
      "num_reviews": 23,
      "publisher": "manning"
    }
  }
]

但是,全身DSL使您可以更灵活地创建更复杂的查询(我们将在后面看到)并指定您希望如何返回结果。在下面的示例中,我们指定了我们想要返回的结果数,从开始的偏移量(对分页有用),我们想要返回的文档字段以及术语突出显示。请注意,我们使用“ match”查询而不是“ multi_match”查询,因为我们只关心在标题字段中进行搜索。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "match" : {
            "title" : "in action"
        }
    },
    "size": 2,
    "from": 0,
    "_source": [ "title", "summary", "publish_date" ],
    "highlight": {
        "fields" : {
            "title" : {}
        }
    }
}
[Results]
"hits": {
  "total": 2,
  "max_score": 1.6323128,
  "hits": [
    {
      "_index": "bookdb_index",
      "_type": "book",
      "_id": "3",
      "_score": 1.6323128,
      "_source": {
        "summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
        "title": "Elasticsearch in Action",
        "publish_date": "2015-12-03"
      },
      "highlight": {
        "title": [
          "Elasticsearch <em>in</em> <em>Action</em>"
        ]
      }
    },
    {
      "_index": "bookdb_index",
      "_type": "book",
      "_id": "4",
      "_score": 1.6323128,
      "_source": {
        "summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
        "title": "Solr in Action",
        "publish_date": "2014-04-05"
      },
      "highlight": {
        "title": [
          "Solr <em>in</em> <em>Action</em>"
        ]
      }
    }
  ]

注意:对于多字查询,match 查询允许您指定是使用and运算符而不是默认的or运算符。您还可以指定 用于调整返回结果的相关性的minimum_should_match选项。详细信息可以在Elasticsearch指南中找到 。

提高

由于我们正在搜索多个字段,因此我们可能希望提高某个字段的分数。在下面的设计示例中,我们将摘要字段的得分提高了3倍,以增加摘要字段的重要性,这反过来又会增加_id 4文档的相关性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "multi_match" : {
            "query" : "elasticsearch guide",
            "fields": ["title", "summary^3"]
        }
    },
    "_source": ["title", "summary", "publish_date"]
}
[Results]
"hits": {
  "total": 3,
  "max_score": 3.9835935,
  "hits": [
    {
      "_index": "bookdb_index",
      "_type": "book",
      "_id": "4",
      "_score": 3.9835935,
      "_source": {
        "summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
        "title": "Solr in Action",
        "publish_date": "2014-04-05"
      }
    },
    {
      "_index": "bookdb_index",
      "_type": "book",
      "_id": "3",
      "_score": 3.1001682,
      "_source": {
        "summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
        "title": "Elasticsearch in Action",
        "publish_date": "2015-12-03"
      }
    },
    {
      "_index": "bookdb_index",
      "_type": "book",
      "_id": "1",
      "_score": 2.0281231,
      "_source": {
        "summary": "A distibuted real-time search and analytics engine",
        "title": "Elasticsearch: The Definitive Guide",
        "publish_date": "2015-02-07"
      }
    }
  ]

注意:提升不仅仅意味着计算得分乘以提升因子。应用的实际增强值通过标准化和一些内部优化。有关增强功能如何工作的更多信息,请参阅Elasticsearch指南

Bool查询

AND / OR / NOT运算符可用于微调我们的搜索查询,以提供更相关或特定的结果。这在搜索API中作为 bool 查询实现。该bool查询接受一个 must 参数(相当于AND),一个 must_not 参数(相当于NOT),以及一个 should 参数(相当于OR)。例如,如果我想在标题中搜索带有“Elasticsearch”或“Solr”字样的书,则由“clinton gormley”创作,但不是由“radu gheorge”创作的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
  "query": {
    "bool": {
      "must": {
        "bool" : { 
          "should": [
            { "match": { "title": "Elasticsearch" }},
            { "match": { "title": "Solr" }} 
          ],
          "must": { "match": { "authors": "clinton gormely" }} 
        }
      },
      "must_not": { "match": {"authors": "radu gheorge" }}
    }
  }
}
[Results]
"hits": [
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "1",
    "_score": 2.0749094,
    "_source": {
      "title": "Elasticsearch: The Definitive Guide",
      "authors": [
        "clinton gormley",
        "zachary tong"
      ],
      "summary": "A distibuted real-time search and analytics engine",
      "publish_date": "2015-02-07",
      "num_reviews": 20,
      "publisher": "oreilly"
    }
  }
]

注意:正如您所看到的,bool查询可以包装任何其他查询类型,包括其他bool查询,以创建任意复杂或深度嵌套的查询。

模糊查询

可以在匹配和多匹配查询上启用模糊匹配以捕获拼写错误。基于与原始单词的Levenshtein距离来指定模糊度,即,一个字符的数量需要对一个字符串进行更改以使其与另一个字符串相同。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "multi_match" : {
            "query" : "comprihensiv guide",
            "fields": ["title", "summary"],
            "fuzziness": "AUTO"
        }
    },
    "_source": ["title", "summary", "publish_date"],
    "size": 1
}
[Results]
"hits": [
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "4",
    "_score": 2.4344182,
    "_source": {
      "summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
      "title": "Solr in Action",
      "publish_date": "2014-04-05"
    }
  }
]

注意: 您可以指定数字0,1或2,而不是指定“自动”,以指示可以对字符串进行编辑以查找匹配项的最大编辑数。使用“AUTO”的好处是它考虑了字符串的长度。对于长度仅为3个字符的字符串,允许2的模糊性将导致较差的搜索性能。因此,在大多数情况下,建议坚持使用“自动”。

通配符查询

通配符查询允许您指定要匹配的模式而不是整个术语。 ? 匹配任何字符和 * 匹配零个或多个字符。例如,要查找具有名称以字母“t”开头的作者的所有记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "wildcard" : {
            "authors" : "t*"
        }
    },
    "_source": ["title", "authors"],
    "highlight": {
        "fields" : {
            "authors" : {}
        }
    }
}
[Results]
"hits": [
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "1",
    "_score": 1,
    "_source": {
      "title": "Elasticsearch: The Definitive Guide",
      "authors": [
        "clinton gormley",
        "zachary tong"
      ]
    },
    "highlight": {
      "authors": [
        "zachary <em>tong</em>"
      ]
    }
  },
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "2",
    "_score": 1,
    "_source": {
      "title": "Taming Text: How to Find, Organize, and Manipulate It",
      "authors": [
        "grant ingersoll",
        "thomas morton",
        "drew farris"
      ]
    },
    "highlight": {
      "authors": [
        "<em>thomas</em> morton"
      ]
    }
  },
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "4",
    "_score": 1,
    "_source": {
      "title": "Solr in Action",
      "authors": [
        "trey grainger",
        "timothy potter"
      ]
    },
    "highlight": {
      "authors": [
        "<em>trey</em> grainger",
        "<em>timothy</em> potter"
      ]
    }
  }
]

Regexp查询

Regexp查询允许您指定比通配符查询更复杂的模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "regexp" : {
            "authors" : "t[a-z]*y"
        }
    },
    "_source": ["title", "authors"],
    "highlight": {
        "fields" : {
            "authors" : {}
        }
    }
}
[Results]
"hits": [
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "4",
    "_score": 1,
    "_source": {
      "title": "Solr in Action",
      "authors": [
        "trey grainger",
        "timothy potter"
      ]
    },
    "highlight": {
      "authors": [
        "<em>trey</em> grainger",
        "<em>timothy</em> potter"
      ]
    }
  }
]

匹配短语查询

匹配短语查询要求查询字符串中的所有术语都存在于文档中,采用查询字符串中指定的顺序并且彼此接近。默认情况下,这些术语必须完全相邻,但您可以指定一个slop 值,该值指示允许的术语相隔多远,同时仍然认为文档匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "multi_match" : {
            "query": "search engine",
            "fields": ["title", "summary"],
            "type": "phrase",
            "slop": 3
        }
    },
    "_source": [ "title", "summary", "publish_date" ]
}
[Results]
"hits": [
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "4",
        "_score": 0.22327082,
        "_source": {
          "summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
          "title": "Solr in Action",
          "publish_date": "2014-04-05"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "1",
        "_score": 0.16113183,
        "_source": {
          "summary": "A distibuted real-time search and analytics engine",
          "title": "Elasticsearch: The Definitive Guide",
          "publish_date": "2015-02-07"
        }
      }
    ]

注意:在上面的示例中,对于非短语类型查询,文档_id 1通常具有较高的分数并显示在文档之前, _id 4 因为其字段长度较短。但是,作为短语查询,术语的接近程度被考虑在内,因此文档 _id 4分数更好。

注意:另请注意,如果slop参数减少为1,则文档_id 1将不再出现在结果集中。

匹配短语前缀

匹配短语前缀查询在查询时提供“搜索”类型或穷人的自动完成版本,无需以任何方式准备数据。与match_phrase 查询一样 ,它接受一个 slop 参数来使单词顺序和相对位置稍微不那么严格。它还接受 max_expansions 参数来限制匹配的术语数量,以减少资源强度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "match_phrase_prefix" : {
            "summary": {
                "query": "search en",
                "slop": 3,
                "max_expansions": 10
            }
        }
    },
    "_source": [ "title", "summary", "publish_date" ]
}
[Results]
"hits": [
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "4",
        "_score": 0.5161346,
        "_source": {
          "summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
          "title": "Solr in Action",
          "publish_date": "2014-04-05"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "1",
        "_score": 0.37248808,
        "_source": {
          "summary": "A distibuted real-time search and analytics engine",
          "title": "Elasticsearch: The Definitive Guide",
          "publish_date": "2015-02-07"
        }
      }
    ]

注意:查询时搜索类型具有性能成本。更好的解决方案是索引时搜索类型。有关更多信息,请查看Completion Suggester APIEdge-Ngram过滤器的使用。

请求参数

query_string查询提供了一种以简洁的简写语法执行multi_match 查询,bool查询,提升,模糊匹配,通配符,正则表达式和范围查询的方法。在下面的示例中,我们对术语“搜索算法”执行模糊搜索,其中一个书籍作者是“grant ingersoll”或“tom morton”。我们搜索所有字段,但在摘要字段中应用2的提升。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "query_string" : {
            "query": "(saerch~1 algorithm~1) AND (grant ingersoll)  OR (tom morton)",
            "fields": ["title", "authors" , "summary^2"]
        }
    },
    "_source": [ "title", "summary", "authors" ],
    "highlight": {
        "fields" : {
            "summary" : {}
        }
    }
}
[Results]
"hits": [
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "2",
    "_score": 3.571021,
    "_source": {
      "summary": "organize text using approaches such as full-text search, proper name recognition, clustering, tagging, information extraction, and summarization",
      "title": "Taming Text: How to Find, Organize, and Manipulate It",
      "authors": [
        "grant ingersoll",
        "thomas morton",
        "drew farris"
      ]
    },
    "highlight": {
      "summary": [
        "organize text using approaches such as full-text <em>search</em>, proper name recognition, clustering, tagging"
      ]
    }
  }
]

简单查询字符串

simple_query_string查询是一个更适合于暴露给用户提供一个单一的搜索框使用的query_string查询版本,因为它取代了使用AND / OR / NOT与+ / | / -分别与它丢弃的无效部分如果用户犯了错误,则查询而不是抛出异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "simple_query_string" : {
            "query": "(saerch~1 algorithm~1) + (grant ingersoll)  | (tom morton)",
            "fields": ["title", "authors" , "summary^2"]
        }
    },
    "_source": [ "title", "summary", "authors" ],
    "highlight": {
        "fields" : {
            "summary" : {}
        }
    }
}

术语/术语查询

以上示例是全文搜索的示例。有时我们对结构化搜索更感兴趣,我们希望在其中找到完全匹配并返回结果。termterms查询在这里帮助我们。在下面的示例中,我们正在搜索Manning Publications发布的索引中的所有书籍。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "term" : {
            "publisher": "manning"
        }
    },
    "_source" : ["title","publish_date","publisher"]
}
[Results]
"hits": [
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "2",
        "_score": 1.2231436,
        "_source": {
          "publisher": "manning",
          "title": "Taming Text: How to Find, Organize, and Manipulate It",
          "publish_date": "2013-01-24"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "3",
        "_score": 1.2231436,
        "_source": {
          "publisher": "manning",
          "title": "Elasticsearch in Action",
          "publish_date": "2015-12-03"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "4",
        "_score": 1.2231436,
        "_source": {
          "publisher": "manning",
          "title": "Solr in Action",
          "publish_date": "2014-04-05"
        }
      }
    ]

可以通过使用terms 关键字并传入搜索项数组来指定多个术语。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "query": {
        "terms" : {
            "publisher": ["oreilly", "packt"]
        }
    }
}

术语查询 - 已排序

术语查询结果(与任何其他查询结果一样)可以轻松排序。还允许多级排序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "term" : {
            "publisher": "manning"
        }
    },
    "_source" : ["title","publish_date","publisher"],
    "sort": [
        { "publish_date": {"order":"desc"}}
    ]
}
[Results]
"hits": [
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "3",
    "_score": null,
    "_source": {
      "publisher": "manning",
      "title": "Elasticsearch in Action",
      "publish_date": "2015-12-03"
    },
    "sort": [
      1449100800000
    ]
  },
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "4",
    "_score": null,
    "_source": {
      "publisher": "manning",
      "title": "Solr in Action",
      "publish_date": "2014-04-05"
    },
    "sort": [
      1396656000000
    ]
  },
  {
    "_index": "bookdb_index",
    "_type": "book",
    "_id": "2",
    "_score": null,
    "_source": {
      "publisher": "manning",
      "title": "Taming Text: How to Find, Organize, and Manipulate It",
      "publish_date": "2013-01-24"
    },
    "sort": [
      1358985600000
    ]
  }
]

注意:在ES6中,要按文本字段(例如标题)进行排序或聚合,您需要在该字段上启用fielddata。有关这方面的更多详细信息,请参阅ElasticSearch指南

范围查询

另一个结构化查询示例是范围查询。在此示例中,我们搜索2015年发布的书籍。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "range" : {
            "publish_date": {
                "gte": "2015-01-01",
                "lte": "2015-12-31"
            }
        }
    },
    "_source" : ["title","publish_date","publisher"]
}
[Results]
"hits": [
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "1",
        "_score": 1,
        "_source": {
          "publisher": "oreilly",
          "title": "Elasticsearch: The Definitive Guide",
          "publish_date": "2015-02-07"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "3",
        "_score": 1,
        "_source": {
          "publisher": "manning",
          "title": "Elasticsearch in Action",
          "publish_date": "2015-12-03"
        }
      }
    ]

注意:范围查询适用于日期,数字和字符串类型字段。

过滤的Bool查询

使用bool查询时,可以使用filter子句来过滤查询结果。对于我们的示例,我们在标题或摘要中查询带有“Elasticsearch”一词的书籍,但我们希望将结果过滤为仅包含20个或更多评论的书籍。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "filtered": {
            "query" : {
                "multi_match": {
                    "query": "elasticsearch",
                    "fields": ["title","summary"]
                }
            },
            "filter": {
                "range" : {
                    "num_reviews": {
                        "gte": 20
                    }
                }
            }
        }
    },
    "_source" : ["title","summary","publisher", "num_reviews"]
}
[Results]
"hits": [
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "1",
        "_score": 0.5955761,
        "_source": {
          "summary": "A distibuted real-time search and analytics engine",
          "publisher": "oreilly",
          "num_reviews": 20,
          "title": "Elasticsearch: The Definitive Guide"
        }
      }
    ]

可以通过使用 bool过滤器组合多个过滤器。在下一个示例中,过滤器确定返回的结果必须至少有20条评论,不得在2015年之前发布,并且应由O'Reilly发布。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "filtered": {
            "query" : {
                "multi_match": {
                    "query": "elasticsearch",
                    "fields": ["title","summary"]
                }
            },
            "filter": {
                "bool": {
                    "must": {
                        "range" : { "num_reviews": { "gte": 20 } }
                    },
                    "must_not": {
                        "range" : { "publish_date": { "lte": "2014-12-31" } }
                    },
                    "should": {
                        "term": { "publisher": "oreilly" }
                    }
                }
            }
        }
    },
    "_source" : ["title","summary","publisher", "num_reviews", "publish_date"]
}
[Results]
"hits": [
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "1",
        "_score": 0.5955761,
        "_source": {
          "summary": "A distibuted real-time search and analytics engine",
          "publisher": "oreilly",
          "num_reviews": 20,
          "title": "Elasticsearch: The Definitive Guide",
          "publish_date": "2015-02-07"
        }
      }
    ]

功能评分:字段值因子

可能存在这样的情况:您希望将文档中特定字段的值计入相关性分数的计算中。在您希望根据文档的受欢迎程度提高文档相关性的情况下,这是典型的。在我们的例子中,我们希望更受欢迎的书籍(根据评论数量判断)得到提升。这可以使用field_value_factor功能分数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "function_score": {
            "query": {
                "multi_match" : {
                    "query" : "search engine",
                    "fields": ["title", "summary"]
                }
            },
            "field_value_factor": {
                "field" : "num_reviews",
                "modifier": "log1p",
                "factor" : 2
            }
        }
    },
    "_source": ["title", "summary", "publish_date", "num_reviews"]
}
[Results]
"hits": [
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "1",
        "_score": 0.44831306,
        "_source": {
          "summary": "A distibuted real-time search and analytics engine",
          "num_reviews": 20,
          "title": "Elasticsearch: The Definitive Guide",
          "publish_date": "2015-02-07"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "4",
        "_score": 0.3718407,
        "_source": {
          "summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
          "num_reviews": 23,
          "title": "Solr in Action",
          "publish_date": "2014-04-05"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "3",
        "_score": 0.046479136,
        "_source": {
          "summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
          "num_reviews": 18,
          "title": "Elasticsearch in Action",
          "publish_date": "2015-12-03"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "2",
        "_score": 0.041432835,
        "_source": {
          "summary": "organize text using approaches such as full-text search, proper name recognition, clustering, tagging, information extraction, and summarization",
          "num_reviews": 12,
          "title": "Taming Text: How to Find, Organize, and Manipulate It",
          "publish_date": "2013-01-24"
        }
      }
    ]

注1:我们可以只运行常规multi_match查询并按num_reviews字段排序,但之后我们失去了相关性评分的好处。

注2:有许多附加参数可以调整增强效果对原始相关性得分的影响程度,例如“修饰符”,“因子”,“boost_mode”等。这些参数在Elasticsearch指南中详细介绍。

功能评分:衰变函数

假设您没有想要通过字段的值逐步提升,而是想要定位一个理想的值,并且您希望提升因子在离开该值时离得更远。这通常适用于基于纬度/经度,数字字段(如价格或日期)的提升。在我们设计的例子中,我们正在搜索2014年6月左右理想发布的“搜索引擎”书籍。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "function_score": {
            "query": {
                "multi_match" : {
                    "query" : "search engine",
                    "fields": ["title", "summary"]
                }
            },
            "functions": [
                {
                    "exp": {
                        "publish_date" : {
                            "origin": "2014-06-15",
                            "offset": "7d",
                            "scale" : "30d"
                        }
                    }
                }
            ],
            "boost_mode" : "replace"
        }
    },
    "_source": ["title", "summary", "publish_date", "num_reviews"]
}
[Results]
"hits": [
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "4",
        "_score": 0.27420625,
        "_source": {
          "summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
          "num_reviews": 23,
          "title": "Solr in Action",
          "publish_date": "2014-04-05"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "1",
        "_score": 0.005920768,
        "_source": {
          "summary": "A distibuted real-time search and analytics engine",
          "num_reviews": 20,
          "title": "Elasticsearch: The Definitive Guide",
          "publish_date": "2015-02-07"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "2",
        "_score": 0.000011564,
        "_source": {
          "summary": "organize text using approaches such as full-text search, proper name recognition, clustering, tagging, information extraction, and summarization",
          "num_reviews": 12,
          "title": "Taming Text: How to Find, Organize, and Manipulate It",
          "publish_date": "2013-01-24"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "3",
        "_score": 0.0000059171475,
        "_source": {
          "summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
          "num_reviews": 18,
          "title": "Elasticsearch in Action",
          "publish_date": "2015-12-03"
        }
      }
    ]

功能评分:脚本评分

在内置评分函数不能满足您的需求的情况下,可以选择指定用于评分的Groovy脚本。在我们的示例中,我们要指定一个脚本,该脚本在决定评估数量的因素之前会考虑到publish_date 。较新的书籍可能没有那么多的评论,所以他们不应该因此而处于不利地位。

评分脚本如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
publish_date = doc['publish_date'].value
num_reviews = doc['num_reviews'].value
if (publish_date > Date.parse('yyyy-MM-dd', threshold).getTime()) {
  my_score = Math.log(2.5 + num_reviews)
} else {
  my_score = Math.log(1 + num_reviews)
}
return my_score

要动态使用评分脚本,我们使用script_score参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /bookdb_index/book/_search
{
    "query": {
        "function_score": {
            "query": {
                "multi_match" : {
                    "query" : "search engine",
                    "fields": ["title", "summary"]
                }
            },
            "functions": [
                {
                    "script_score": {
                        "params" : {
                            "threshold": "2015-07-30"
                        },
                        "script": "publish_date = doc['publish_date'].value; num_reviews = doc['num_reviews'].value; if (publish_date > Date.parse('yyyy-MM-dd', threshold).getTime()) { return log(2.5 + num_reviews) }; return log(1 + num_reviews);"
                    }
                }
            ]
        }
    },
    "_source": ["title", "summary", "publish_date", "num_reviews"]
}
[Results]
"hits": {
    "total": 4,
    "max_score": 0.8463001,
    "hits": [
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "1",
        "_score": 0.8463001,
        "_source": {
          "summary": "A distibuted real-time search and analytics engine",
          "num_reviews": 20,
          "title": "Elasticsearch: The Definitive Guide",
          "publish_date": "2015-02-07"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "4",
        "_score": 0.7067348,
        "_source": {
          "summary": "Comprehensive guide to implementing a scalable search engine using Apache Solr",
          "num_reviews": 23,
          "title": "Solr in Action",
          "publish_date": "2014-04-05"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "3",
        "_score": 0.08952084,
        "_source": {
          "summary": "build scalable search applications using Elasticsearch without having to do complex low-level programming or understand advanced data science algorithms",
          "num_reviews": 18,
          "title": "Elasticsearch in Action",
          "publish_date": "2015-12-03"
        }
      },
      {
        "_index": "bookdb_index",
        "_type": "book",
        "_id": "2",
        "_score": 0.07602123,
        "_source": {
          "summary": "organize text using approaches such as full-text search, proper name recognition, clustering, tagging, information extraction, and summarization",
          "num_reviews": 12,
          "title": "Taming Text: How to Find, Organize, and Manipulate It",
          "publish_date": "2013-01-24"
        }
      }
    ]
  }

注意1:要使用动态脚本,必须在config/elasticsearch.yaml 文件中为Elasticsearch实例启用它 。也可以使用已存储在Elasticsearch服务器上的脚本。有关更多信息,请查看Elasticsearch参考文档

注意2: JSON不能包含嵌入的换行符,因此分号用于分隔语句。

原文标题《23 Useful Elasticsearch Example Queries》

作者:Tim Ojo

译者:February

不代表云加社区观点,更多详情请查看原文链接

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
运维未来的发展方向是智能运维(AIops)
本文探讨了运维未来的发展方向是智能运维(AIops),并提出了智能运维在故障定位、自动化运维和移动端运维等方面的应用。作者认为智能运维能够提高企业的运维效率,减少人为干预,并有助于企业更好地应对市场变化。然而,智能运维的发展仍面临诸多挑战,如数据质量、算法复杂度等问题。
日志易
2017/12/13
4K0
云时代,如何保障运维安全?
运维是一个非常广泛的定义,在不同的用户不同的阶段有着不同的职责与定位。在初创公司,运维工程师的工作可能需要从申请域名开始,购买或租用服务器,上架,调整网络设备的设置,部署操作系统和运行环境,部署代码,设计和部署监控,防止漏洞和攻击等等。
尚思卓越
2023/11/16
4480
云时代,如何保障运维安全?
运维安全,没那么简单
随着IT技术和业务的发展,以及各式各样安全漏洞的涌现,运维与安全这两个专业日渐交融,人们对运维安全的重视程度越来越高,出现了一个新的交叉领域叫“运维安全”。黑客、白帽子忙于挖掘运维安全漏洞,企业忙于构建运维安全体系,一时间无数漏洞纷至沓来,座座堡垒拔地而起。作者立足自身多年运维安全实践,也来探讨一二。本文按照提出问题到回应答案的思路,先抛出作者对运维安全的理解,并解释了重视运维安全的原因。接着根据在运维安全一线发现的工作陋习以及企业面临的常见问题,整理出通用运维安全问题分类。之后对症下药,提出一个好的运维安全形态:不仅在于工程师们的安全意识,更在于一套相对完整的运维安全体系,从流程到技术,点线面多位一体共同缔造。
0xtuhao
2022/06/21
2.4K0
运维安全,没那么简单
云计算:拼的就是运维
有点长,有些内容可能略显陈旧,与当前的现状已经有了很大不同,但是其中传递的思想和观点并不过时,耐心看完一定大有收获。
赵成
2019/11/14
3K0
日志易:IT 运维分析及海量日志搜索的实践之路(上)
本文介绍了日志易产品如何帮助用户解决海量日志搜索问题,通过全文搜索引擎、分布式日志存储、实时日志处理、日志分析可视化等方案,大大提高了日志管理效率。同时,日志易还提供了丰富的日志分析功能,如日志关联分析、实时分析、日志预警等,可以满足各种业务场景的需求。此外,日志易还提供了日志易分析系统、日志易可视化系统等工具,以帮助用户更方便地使用日志易产品。
日志易
2017/05/27
4.4K0
日志易:IT 运维分析及海量日志搜索的实践之路(上)
云计算时代,不会编程的运维必将失业?
在互联网时代,运维人员就是这样的存在:小到一条信息发送,大到一次网络购物狂欢,只要和IT相关的业务就需要这些运维人员,没有他们在背后的支持,企业就会出大乱子。 假如一个企业没有了运维工程师,无论你的产品体验多么优秀、技术多么先进,都会因为无法正常提供服务而被用户所淘汰。 试想一下:你通过微信加上了自己的初恋,你发现她这几年过得并不顺利,对于学生时代念念不忘,最重要的是,她刚刚和前任分手,又罕见的表现出了想找个老实人结婚的想法。 你很高兴!你赶紧表明自己单身二十七年三个月零七天就是在等她! 就在这时候,
小小科
2018/05/03
1.3K0
云计算时代,不会编程的运维必将失业?
无论是云计算SaaS,PaaS还是IaaS,拼的都是运维!
发展至今,云计算提供三种形式的云服务,基础设施即服务(IaaS),平台即服务(PaaS)和软件即服务(SaaS)。尽管这三种服务形式有所差异,其最终的目的就是为用户提供服务(Service)的,而不仅仅是软硬件和各种资源。 下面小编将带你了解一下为何说这三种云服务最终拼的都是运维,以下将了解一下关于云计算的技术难点和云计算的门槛。 PaaS+IaaS+SaaS云计算的技术难点 到今天,云计算的工业实现已经不太难了。现在有开源软件KVM和Xen,这两个东西基本把虚拟化搞定;而OpenStack则把管理、控制系
我是攻城师
2018/05/11
2.1K0
【腾讯云的1001种玩法】运维的网络管理利器:弹性网卡体验
天问
2017/03/12
14.3K1
【腾讯云的1001种玩法】运维的网络管理利器:弹性网卡体验
张戎:腾讯云智能运维(AIOps)项目实践
11月9日,云+社区技术沙龙“高效智能运维”圆满落幕。本期沙龙围绕运维展开了一场技术盛宴,从AIOps、Serverless DevOps、蓝鲸PaaS平台、K8S等分享关于业务运维的技术实践干货,同时带来腾讯海量业务自研上云实践,推动传统运维向云运维转型。下面是张戎老师关于机器学习算法在时间序列的异常检测,故障的根因分析,时间序列预测方面的应用的内容分享。
腾讯云开发者社区技术沙龙
2019/11/14
4.5K0
张戎:腾讯云智能运维(AIOps)项目实践
公有云和私有云的区别:多维度详细对比
云计算发展那么多年,大家都知道业界现在云计算服务的模式还是老三样:公有云、私有云、混合云。但是即便如此,公有云和私有云的区别到底在哪,这其中,肯定有人想过。这次阿祥也是应粉丝需求,将公有云和私有云从模式、架构、业务类型等多维度对比一下,帮助粉丝更好理解两者的区别。
ICT系统集成阿祥
2024/12/19
2.1K0
公有云和私有云的区别:多维度详细对比
云计算:拼的是运维
云计算的IaaS、PaaS、SaaS最后那个S都是Service。就是说,无论你云计算长成什么样,都得要向用户提供“服务”而不仅仅是软硬件和各种资源。 【云计算的技术难点】 到今天,云计算的工业实现已经不太难了。现在有开源软件KVM和Xen,这两个东西基本把虚拟化搞定;而OpenStack则把管理、控制系统搞定,也很成熟。PaaS也有相应的开源,比如OpenShift,而Java里也有N多的中间件框架和技术。另外分布式文件系统GFS/TFS,分布式计算系统Hadoop/Hbase等等,分布式的东西都不神秘了
静一
2018/03/20
3.1K0
从零起步做到Linux运维经理,你必须管好的23个细节
不想成为将军的士兵,不是好士兵-拿破仑 如何成为运维经理?成为运维经理需要什么样的能力?我想很多运维工程师都会有这样的思考和问题。 如何成为运维经理。一般来说,运维经理大概有两种出身,一种是从底层最基础的维护做起,通过出色的维护工作,让公司领导对这个人非常认可,同时对Linux运维工作也比较重视,逐步走向Manager的岗位。第二种是业务管理出身或者有IT技术背景,具备了一定经验直接进入IT管理层的人员。 那么做为一个Linux运维经理,你需要哪些技能武器、管理哪些细节,具备什么样的能力? ----
小小科
2018/05/03
2.4K0
从零起步做到Linux运维经理,你必须管好的23个细节
Linux运维人,该醒醒了,2019年要变天了
外界都说运维只是处于被动低效率手工救火的状态,企业对其重视程度不高,提起运维很多人能联想到的字眼就有“苦逼”、“辛苦”、“加班”、“背锅”。在大数据、人工智能、容器技术的强力加持下,运维这个传统的技术工种已经从“机械劳动”这样的刻板印象中蜕变出来,成为了任何一家技术公司所必须依赖和大力投入的核心技术能力。
马哥linux运维
2019/07/09
2.1K1
Linux运维人,该醒醒了,2019年要变天了
【云端风云:云计算全局解密】一篇文章读懂云计算技术及其未来发展趋势
在当今数字化浪潮中,云计算如一颗闪烁的科技明珠,为企业和个人带来了前所未有的灵活性、效率和创新力。本文将带领读者深入探索云计算的核心概念、关键服务模型以及未来发展趋势。云计算不仅是数字化时代的基石,更是推动创新和变革的引擎。站在云端风云之巅,我们将解析云计算的奥秘,揭晓数字化未来的蓬勃蔓延。通过这场科技奇迹的探索,我们将共同领略云计算为全球带来的变革,见证科技与未来的奇妙融合。
奥耶可乐冰
2023/11/24
1.5K0
【云端风云:云计算全局解密】一篇文章读懂云计算技术及其未来发展趋势
从维护性工作到软件开发革命,运维15年间的大逆转
作者 | Tina 在 InfoQ 成立 15 周年之际,InfoQ 编辑部发起了“2007-2022:云、运维、架构、前端的 15 年演进史”特别策划,将和业内专家共同盘点云计算、运维、架构、前端四大技术领域的演进历史,试图从几个切面窥见 IT 技术的演进规律。本文是运维篇。 特此感谢岳上、刘毅二位老师对本文的贡献,他们的真知灼见,是本文能与大家见面的关键。 运维的工作主要是“运行”和“维护”,本质上是保证软件系统的稳定运行。 中国互联网从 20 世纪 90 年代开始形成,随后进入快速发展阶段。中
深度学习与Python
2023/03/29
3190
从维护性工作到软件开发革命,运维15年间的大逆转
IT运维发展进程中不同时期的差异!传统运维、互联网运维、业务运维
从信息化时代到互联网时代,再到如今大幕初启的数字化时代,IT、互联网和移动化已经渗透到工作和生活的方方面面。今年早些时候一群歪果仁评选出中国的新“四大发明”——高铁、网购、支付宝和共享单车,后三样都是来自于IT变革。而运维作为IT运行的有力保障,在不同时期和不同类型的企业中正在发挥着越来越大的支撑和引领作用,今天就让我们聊聊信息化时代的传统运维、互联网时代的互联网运维和数字化时代的业务运维有什么不同!
智能运维圈
2021/05/11
3.7K0
IT运维发展进程中不同时期的差异!传统运维、互联网运维、业务运维
6类防火墙 3维度选型决策 1文了解
如需更详细了解防火墙各部署模式的差别,可查看文章《防火墙四种工作模式:路由模式、透明模式、混合模式、旁路模式》
ICT系统集成阿祥
2025/03/31
1490
6类防火墙 3维度选型决策 1文了解
日进斗金的银行业务保障,靠这样的运维服务!
本文介绍了如何通过自动化运维平台实现IaaS层资源的统一管理,并针对金融云场景提供了详细的解决方案。
织云平台团队
2017/09/22
1.7K0
日进斗金的银行业务保障,靠这样的运维服务!
做运维的感悟(做运维需要考虑事,运维组织结构,运维学习地图....)
不过大公司会专门做某一部分,例如应用运维不需要关注测试和安全等方面,但建议都学学,触类旁通有好处。 有这些基础,进到公司就可以去完成基础的建设工作了。比如会安排你搭建服务,整理资产报表,清理一些日志,这些基本工作可以帮助你了解公司当前有哪些服务,各种服务之间是如何运作的,之后再慢慢参与到业务中,薪资一线城市可以达到6-10k左右。
iginkgo18
2020/12/23
6.5K0
做运维的感悟(做运维需要考虑事,运维组织结构,运维学习地图....)
开发和运维的关系,实施和运维的区别
随着网络的发展,想要把企业网站建设好,建设完成后运营好实现盈利,就需要很多人员的支持,其中运维岗位和开发岗位尤其重要。
chenchenchen
2019/09/03
11.4K0
推荐阅读
相关推荐
运维未来的发展方向是智能运维(AIops)
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 举例
    • 基本匹配查询
    • 提高
    • Bool查询
    • 模糊查询
    • 通配符查询
    • Regexp查询
    • 匹配短语查询
    • 匹配短语前缀
    • 请求参数
    • 简单查询字符串
    • 术语/术语查询
    • 术语查询 - 已排序
    • 范围查询
    • 过滤的Bool查询
    • 功能评分:字段值因子
    • 功能评分:衰变函数
    • 功能评分:脚本评分
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档