Elasticsearch嵌套搜索

iyfamqjs  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(96)

以下是我的Map:

def searchkick_index
{
  settings: {
    # Custom settings if needed
  },
  mappings: {
    properties: {
      inventoryindex: { type: 'keyword' },
      codebook3index: { type: 'keyword' },
      warehouseindex: { type: 'keyword' },
      rackno: { type: 'keyword' },
      qty: { type: 'integer' },
      unitsize: { type: 'integer' },
      secno: { type: 'keyword' },
      deleteflag: { type: 'boolean' },
      productindex: { type: 'keyword' },
      fullunit: { type: 'keyword' },
      site: { type: 'keyword' },
      lab_hold: { type: 'boolean' },
      arrivaldate: { type: 'date' },
      qccleared: { type: 'boolean' },
      lotno: { type: 'keyword' },
      recordtime: { type: 'date' },
      rcvdunitsize: { type: 'integer' },
      product: {
        type: 'nested',
        properties: {
          productindex: { type: 'keyword' },
          productcode: { type: 'keyword' },
          productdesc: { type: 'text' }
        }
      }
    }
  }
}
end

这是我的查询,它工作得很好:

"query": {
    "bool": {
      "must": [
        { "match": { "deleteflag": false } },
        { "match": { "lotno": "123003001*" } }
      ]
    }
  }

但是如果我想像下面这样通过product.prodoctcode进行过滤,结果是空的,我不确定我在这里做错了什么。

"query": {
    "bool": {
      "must": [
        { "match": { "deleteflag": false } },
        { "match": { "lotno": "123003001*" } },
        { "match": { "product.productcode": "20381ONPW" } }
      ]
    }
  }

我在Ruby on Rails应用程序中使用了Searchkick gem,我在模型中的Map如下:

def search_data
    {
      inventoryindex: inventoryindex,
      codebook3index: codebook3index,
      warehouseindex: warehouseindex,
      rackno: rackno,
      qty: qty,
      unitsize: unitsize,
      secno: secno,
      deleteflag: deleteflag,
      productindex: productindex,
      fullunit: fullunit,
      site: site,
      lab_hold: lab_hold,
      arrivaldate: arrivaldate,
      qccleared: qccleared,
      lotno: lotno,
      recordtime: recordtime,
      rcvdunitsize: rcvdunitsize,
      product: [
        {
          productindex: product.productindex,
          productcode: product.productcode,
          productdesc: product.productdesc
        }
      ]
    }
  end
qcuzuvrc

qcuzuvrc1#

嵌套字段被索引为单独的隐藏文档,因此需要特殊的查询来搜索它们。这里有三种可能的解决方案。
1.您不仅可以将嵌套字段索引为隐藏文档,还可以将其索引为父文档的一部分。为此,在嵌套字段Map中设置include_in_parentinclude_in_root。在这种情况下,您的搜索将按原样工作,但实际上您将对该字段进行两次索引。
1.你可以保持Map不变,使用特殊的nested query代替最后的match

"query": {
    "bool": {
      "must": [
        { "match": { "deleteflag": false } },
        { "match": { "lotno": "123003001*" } },
        { 
          "nested": {
            "path": "product",
            "query": {
              "match": { "product.productcode": "20381ONPW" }
            }
          }
        }
      ]
    }
  }

1.如果您不打算同时按产品代码、索引和描述进行搜索(例如,查找至少一个产品同时具有索引“ABC”和描述“XYZ”的所有记录),则可以将产品从嵌套转换为对象。在继续之前,请确保您完全了解此解决方案与嵌套解决方案相比的局限性。

相关问题