【问题标题】:Strange output query Elastic Search奇怪的输出查询 Elastic Search
【发布时间】:2017-09-11 09:52:31
【问题描述】:

我刚开始使用 Elastic Search。我已经正确设置了所有内容。我正在使用 Firebase + Flashlight + 弹性搜索。

在我的前端,我根据不同的搜索参数构建查询。我将它们插入到 Firebase /search/requests/ 中的一个节点中。手电筒会捡起这个并将回复放入/search/response,这就像一个魅力!

但是,我不确定如何正确编写查询。当我尝试合并两个 must match 查询时,我得到了奇怪的结果。我正在使用查询 DSL。

我在 Elastic Search 中 deliverables/doc 下的文档具有以下方案。

...
{
  "createdBy" : "admin@xx.org",
  "createdOn" : 1501200000000,
  "deadLine" : 1508716800000,
  "description" : {
    "value" : "dummy description"
  },
  "key" : "<FBKEY>",

  "programmes" : [ {
    "code" : "95000",
    "name" : "Test programme",
    "programYear" : 2017
  } ],
  "projects" : [ {
    "projectCode" : "113200",
    "projectName" : "Test project",
    "projectYear" : 2017
  } ],
  "reportingYear" : 2017,
  "status" : "Open",
  "type" : "writing",
  "updatedBy" : "admin@xx.org",
  "updatedOn" : 1501200000000,
},
...

我的查询具有以下结构。

{
   "query": {
    "bool": {
      "must": [
        {
          "match": {
            "createdBy": "xx@company.org"
          },
          "match": {
            "programmes.code": "95000"
          }
        }
      ]
    }
  }
}

在我的输出中,我还得到了不完全包含这两个字段的文档?他们的分数也很低。这正常吗?

我的地图,使用手电筒自动创建

更新 1

我刚刚尝试了这个查询,但是由于没有过滤两个字段,它仍然给了我奇怪的结果:

   {
   "query": {
      "bool": {
         "filter": {
            "bool": {
               "must": [
                  {
                     "match": {
                        "programmes.code": "890000"
                     }
                  },
                  {
                     "match": {
                        "createdBy": "admin@xx.org"
                     }
                  }
               ]
            }
         }
      }
   }
}

【问题讨论】:

    标签: firebase elasticsearch


    【解决方案1】:

    bool query 中使用的must 子句在查询上下文中执行(所有文档按分数降序返回)并有助于分数。 see link

    如果您希望它作为过滤器执行,请使用以下查询:

    {
      "query": {
        "bool": {
          "filter": {
            "bool": {
              "must": [
                {
                  "match": {
                    "createdBy": "xx@company.org"
                  }
                },
                {
                  "match": {
                    "programmes.code": "95000"
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    注意:

    默认分析字符串字段,更新字符串字段映射为not_analyzed,使用filter查询。参考:mapping-intro

    【讨论】:

    • 我刚刚尝试了这个查询,但是它仍然给我一个奇怪的结果,因为它没有过滤两个字段。查看开始帖子中的更新
    • 您可以做的一个修改是将match 替换为term,这样它就不会分析该字段。
    • 如果我用term 替换match 我得到零结果?如果我过滤programmes.code 它可以工作。但不知何故,与programmes.codecreatedBy 的组合(与其他组合相同)不起作用。
    • 组合不起作用意味着没有文件同时满足这两个条件。请注意,它 must 确实是布尔值 AND,您可能正在寻找一个 should 子句,如果满足任何一个条件,它将返回。
    • 问题出在映射上。默认情况下,会分析字符串字段。因此,您会得到奇怪的结果。如果您将这些字段的映射更新为“not_analyzed”,则可以使用过滤查询来获得正确的结果。检查此以获取更多详细信息:elastic.co/guide/en/elasticsearch/guide/current/…
    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多