弹性搜索产生的虚假结果

时间:2015-03-01 17:04:51

标签: elasticsearch

我怀疑我不能(或者我还没有完全绝望地尝试!)提供足够的信息给你足够的工作,但我只是希望有人可以让我知道在哪里调查...

我有一个弹性搜索索引,它在一个实时系统中运行正常。我在索引(productId)中为核心实体添加了3个属性。我正在收回正确的数据,但不时会在返回结果中包含虚假数据。

例如(我已经删除了我的字段列表,它是一个multi_match查询)。

使用Postman我发送

{
  "query" : {     
      "multi_match" : {
        "query" : "FD41D359-1066-47C5-B930-C839F380FBDE",
        "fields" : [ "softwareitem.productId" ]
      }
  }
 }

我希望在这个例子中有1个项目可以回来,而且我得到了2.我已经修改了一点结果,但关键是productId。您可以在返回的第2项中看到它不是产品ID被搜索?

任何人都可以告诉我我应该在哪里看下一个吗?我的查询是否存在错误,或者您认为索引可能在某种程度上已损坏?

{
    "took": 3,
  "timed_out": false,
  "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
  },
  "hits": {
      "total": 2,
      "max_score": 27.424479,
      "hits": [
          {
              "_index": "core_products",
              "_type": "softwareitem",
              "_id": "040EEEA1-4758-4F01-A55A-CAE710117C81",
              "_score": 27.424479,
              "_source": {
                  "id": "040EEEA1-4758-4F01-A55A-CAE710117C81",
                  "productId": "FD41D359-1066-47C5-B930-C839F380FBDE",
                  "softwareitem": {
                      "id": "040EEEA1-4758-4F01-A55A-CAE710117C81",
                      "title": "Code Library",
                      "description": "Blah Blah Blah",
                      "rmType": "Software",
                      "created": 1424445765000,
                      "updated": null
                  },
                  "searchable": true
              }
          },
          {
                "_index": "core_products",
              "_type": "softwareitem",
              "_id": "806B8F04-3E53-4278-BCC2-C2E1A17D2813",
              "_score": 1.049637,
              "_source": {
                  "id": "806B8F04-3E53-4278-BCC2-C2E1A17D2813",
                  "productId": "9FB80ABA-B09C-47C5-929A-9FB6C48BD5A8",
                  "softwareitem": {
                      "id": "806B8F04-3E53-4278-BCC2-C2E1A17D2813",
                      "title": "Video Game",
                      "description": "Blah Blah Blah",
                      "rmType": "Software",
                      "created": 1424445765000,
                      "updated": null
                  },
                  "searchable": true
              }
          }
      ]
  }

}

1 个答案:

答案 0 :(得分:1)

似乎softwareitem.productIdstring field,正在分析它。要对字符串字段进行精确匹配,请在映射中使用not_analyzed字符串字段,如:

"productId" : {
     "type" : "string",
     "index" : "not_analyzed"
 }

您的字段可能已被not_analyzed,您必须进行其他更改。

在查询时,您无需使用multi_match / match查询。这些类型的查询将分析您的输入字符串查询并从该输入中构建更复杂的查询,因此您会看到第二个意外结果(它包含47C5,可能分析器正在标记完整字符串并构建只有一个令牌需要匹配的查询)。您应该使用terms / term次查询