当前位置: 首页 > 知识库问答 >
问题:

嵌套的ElasticSearch查询导致项目过多

高峻
2023-03-14

下面嵌套的ElasticSearch查询返回一些不应该命中的结果。许多结果不包含请求的订单号,但仍然列出了。我没有得到所有的文档,所以查询肯定会在某种程度上减少结果集。

{
  "query": {
    "nested": {
      "path": "orders",
      "query": {
        "match": {
          "orderNumber": "242347"
        }
      }      
    }
  }
}

查询结果(截断):

{
  "took":0,
  "timed_out":false,
  "_shards": {
    "total":1,
    "successful":1,
    "failed":0
  },
  "hits": {
    "total":60,
    "max_score":9.656103,
    "hits":[
      {
        "_index": "index1",
        "_type":"documenttype1",
        "_id":"mUmudQrVSC6rn68ujDJ8iA",
        "_score":9.656103,
        "_source" : {
          "documentId": 12093894,
          "orders": [
          {
            "customerId": 129048669,
            "orderNumber": "242347", // <-- CORRECT HIT ON ORDER
          },
          {
            "customerId": 229405848,
            "orderNumber": "431962"
          }
          ]
        }
      },
      {
        "_index":"index1",
        "_type":"documenttype1",
        "_id":"9iO5QBCpT_6kmH3CoBTdWw",
        "_score":9.656103, 
        "_source" : {
          "documentId": 43390283,
          // <-- ORDER ISN'T HERE BUT THE DOCUMENT IS HIT NEVERTHELESS!
          "orders": [
          {
            "customerId": 229405848,
            "orderNumber": "431962"
          },
          {
            "customerId": 129408979,
            "orderNumber": "142701"
          }
          ]
        }
      }
      // Left out 58 more results most of which do not contain
      // the requested order number.
    ]
  }
}

正如您所看到的,有一个点击(实际上,有相当多的点击)不应该出现,因为没有一个订单包含请求的订单号。

这是文档类型1的映射:

{
   "index1":{
      "properties":{
         "documentId":{
            "type":"integer"
         },
         "orders":{
            "type":"nested",
            "properties":{
               "customerId":{
                  "type":"integer"
               },
               "orderNumber":{
                  "type":"string",
                  "analyzer":"custom_internal_code"
               }
            }
         }
      }
   }
}

最后,以下是澄清上述映射中所述的自定义\u内部\u代码分析器的设置:

{
   "index1":{
      "settings":{
         "index.analysis.analyzer.custom_internal_code.filter.1":"asciifolding",
         "index.analysis.analyzer.custom_internal_code.type":"custom",
         "index.analysis.analyzer.custom_internal_code.filter.0":"lowercase",
         "index.analysis.analyzer.custom_internal_code.tokenizer":"keyword",
      }
   }
}

共有2个答案

唐默
2023-03-14

似乎应该使用布尔查询而不是匹配。

但是如果只想筛选记录,则应该使用嵌套筛选而不是查询。它工作得更快,因为你不必计算分数。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "nested": {
          "path": "orders",
          "filter": {
            "bool": {
              "must": [
                {
                  "term": {
                    "orderNumber": "242347"
                  }
                }
              ]
            }
          },
          "_cache": true
        }
      }
    }
  }
}
闽朝
2023-03-14

对于一个精确的搜索使用termQuery[1]和orderNumbernot_analyzed[2]。

[1]http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-term-query.html#query-dsl-term-query

[2] http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping-intro.html#_literal_index_literal

 类似资料:
  • 我试图创建一个嵌套查询,它将过滤掉一些带有特定术语的文档。在本例中,我试图过滤掉在user.first中有匹配术语的文档。数据示例: 我的查询没有得到所需的结果,因为它返回给我所有未筛选的记录。我尝试使用: 我希望这里得到与过滤器不匹配的文档。在这种情况下,它应该只返回第二个文档。做这件事的正确方法是什么?

  • 问题内容: 我在获取与Elasticsearch一起使用的嵌套查询时遇到问题(如果我删除了查询字符串之一,则可以使用)。我要解决的问题是我有一个包含关闭列表的文档(关闭)。我想在条件满足另一个值的闭包列表中搜索一个值。那只是从argan = 1的闭包中获得价值 我正在得到这个错误响应; 我的映射如下所示。 有人知道我在做什么错吗? 问题答案: 您的查询不是有效的查询。您需要使用适当的复合查询将其他

  • 问题内容: 我正在尝试使用query_string编写查询以检索嵌套对象的数据查询。 我想做的查询的一个例子是: 其中“ a”是嵌套对象,“ id”是“ a”的字段。 我知道我可以使用嵌套查询成功地执行此任务,编写如下查询: 但是,我想避免这种情况。我不想自己弄清楚用户正在搜索嵌套字段并修改查询。我尝试使用“ fields”参数,但它似乎不适用于嵌套对象。 是否可以使用“ query_string

  • 问题内容: 我安装了16gb内存的Elasticsearch。我开始使用聚合,但是在尝试发出以下查询时遇到“ java.lang.OutOfMemoryError:Java堆空间”错误: query_string本身仅返回1266次匹配,因此OOM错误让我有些困惑。 我是否正确使用了聚合?如果没有,我该怎么做才能解决此问题?谢谢! 问题答案: 您正在将整个-,-和- 字段加载到内存中以进行汇总。这

  • 问题内容: 我想使用ES进行图书搜索。因此,我决定将作者姓名和标题(作为嵌套文档)放入索引,如下所示: 我不明白的是:如何构造搜索查询,以便在搜索“一二”时仅找到第二本书,而在搜索“二三”时什么也找不到,而在搜索“一”时所有图书呢? 问题答案: 也许是这样的? 该查询基本上说一个文件必须有and 。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套

  • 我有多个嵌套文档doc。嵌套查询工作正常,但它们仍然会返回所有嵌套对象(即整个文档),即使搜索查询只匹配少数嵌套对象。但是,它确实将文档作为一个整体进行过滤。 下面是一个例子: 当在地址中搜索时,理想情况下,我应该只获得带有一个嵌套对象的,但我会获得所有嵌套对象。如何筛选返回的嵌套对象? 示例查询: 该查询的输出是和所有员工,而我只想要。