【问题标题】:Distinct records in Query matching for Elastic Search弹性搜索的查询匹配中的不同记录
【发布时间】:2016-11-02 01:57:38
【问题描述】:

我在弹性搜索中设置了以下记录

POST /books/book/1
{
  "title" : "JavaScript: The Good Parts",
  "author" : "Douglas Crockford",
  "language" : "JavaScript",
  "publishYear" : 2009,
  "soldCopy" : "50"
}

POST /books/book/2
{
  "title" : "JavaScript: The Good Parts",
  "author" : "Douglas Crockford",
  "language" : "JavaScript",
  "publishYear" : 2009,
  "soldCopy" : "110"
}

POST /books/book/3
{
  "title" : "JavaScript: The Good Parts",
  "author" : "Douglas Crockford1",
  "language" : "JavaScript",
  "publishYear" : 2011,
  "soldCopy" : "2"
}

POST /books/book/4
{
  "title" : "JavaScript: The Good Parts",
  "author" : "Douglas Crockford2",
  "language" : "JavaScript",
  "publishYear" : 2012,
  "soldCopy" : "5"
}

我正在使用以下弹性搜索查询根据给定的 2009 年获取不同的标题和作者。我期望的查询的输出是

JavaScript: The Good Parts Douglas Crockford

但在响应中,我得到了 2 条具有相同输出的记录,例如:

JavaScript: The Good Parts      Douglas Crockford
JavaScript: The Good Parts      Douglas Crockford

用于弹性搜索的查询是:

{
  "query": {
    "match": {
      "publishYear": "2009"   }
  }
}

我尝试用数据库术语创建的等效选择查询是:

select distinct title,author from book where publishYear = '2009'

如何从弹性搜索中获得与我的 sql 查询相同的输出? 谢谢

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    sql中的distinct等价于elasticsearch中的terms aggregation

    {
      "query": {
        "match": {
          "publishYear": "2009"
        }
      },
      "aggs": {
        "unique_author": {
          "terms": {
            "field": "author",
            "size": 10
          }
        },
        "unique_book": {
          "terms": {
            "field": "title",
            "size": 10
          }
        }
      },
      "size": 0
    }
    

    为此,您必须将标题和作者字段设置为 not_analyzed 或者您也可以使用 keyword tokenizerlowercase 令牌过滤器。更好的选择是让他们multi fields

    你可以像这样创建索引

    PUT books
    {
      "mappings": {
        "book":{
          "properties": {
            "title":{
              "type": "string",
              "fields": {
                "raw":{
                  "type": "string",
                  "index": "not_analyzed"
                }
              }
            },
            "author":{
              "type": "string",
              "fields": {
                "raw":{
                  "type": "string",
                  "index": "not_analyzed"
                }
              }
            },
            "language":{
              "type": "string"
            },
            "publishYear":{
              "type": "integer"
            },
            "soldCopy":{
              "type": "string"
            }
          }
        }
      }
    }
    

    然后在聚合中使用.raw

    【讨论】:

    • "size": 10 和 "size": 0 在这个查询中是什么意思
    • outer size:0 表示 ES 只会给你聚合结果而不是搜索结果。 size:10 内部聚合会将不同的作者和标题限制为前 10 个结果。
    • 另外,如果我需要相同的查询以在 publishYear 列中使用 IN 运算符,例如选择不同的标题,作者来自 book where publishYear in(2009,2010)。我们该怎么做
    • 您可以使用date 输入publishyear 然后进行范围查询,也可以使用terms query
    • 2.3 版本的弹性搜索是否提供术语查询?
    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多