在 ElasticSearch 中按类型查询更好吗?

Is it better to query by type in ElasticSearch?

我的问题是关于性能。 我经常使用过滤查询,但我不确定按类型查询的正确方法是什么。

首先,让我们看一下 映射:

{
  "my_index": {
    "mappings": {
      "type_Light_Yellow": {
        "properties": {
          "color_type": {
            "properties": {
              "color": {
                "type": "string",
                "index": "not_analyzed"
              },
              "brightness": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "details": {
            "properties": {
              "FirstName": {
                "type": "string",
                "index": "not_analyzed"
              },
              "LastName": {
                "type": "string",
                "index": "not_analyzed"
              },
              .
              .
              .
            }
          } 
        }
      }
    }
  }
}

上面,我们可以看到类型 浅黄色 的一个映射示例。此外,还有更多针对各种类型的映射(颜色。例如:深黄色浅棕色 等等...)

请注意 color_type 的子字段。 对于类型 type_Light_Yellow,值始终为:"color": "Yellow", "brightness" : "Light",对于所有其他类型依此类推。

现在,我的性能问题:我想知道是否有最喜欢的查询索引的方法。

例如,让我们搜索 type_Light_Yellow.

类型下 "details.FirstName": "John""details.LastName": "Doe" 的所有文档

当前方法我正在使用:

curl -XPOST 'http://somedomain.com:1234my_index/_search' -d '{
  "query":{
    "filtered":{
      "filter":{
        "bool":{
          "must":[
          {
            "term":{
              "color_type.color": "Yellow"
            }
          },
          {
            "term":{
              "color_type.brightness": "Light"
            }
          },
          {
            "term":{
              "details.FirstName": "John"
            }
          },
          {
            "term":{
              "details.LastName": "Doe"
            }
          }
          ]
        }
      }
    }
  }
}'

从上面可以看出,通过定义 "color_type.color": "Yellow""color_type.brightness": "Light",我正在查询所有索引和引用类型 type_Light_Yellow,因为它只是我正在搜索的文档下的另一个字段。

替代方法是直接在类型下查询:

curl -XPOST 'http://somedomain.com:1234my_index/type_Light_Yellow/_search' -d '{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
          {
            "term": {
              "details.FirstName": "John"
            }
          },
          {
            "term": {
              "details.LastName": "Doe"
            }
          }
          ]
        }
      }
    }
  }
}'

请注意第一行:my_index/type_Light_Yellow/_search.

  1. 从性能方面来说,什么查询效率更高?
  2. 如果我通过代码查询(我正在使用 Python 和 ElasticSearch 包),是否会有不同的答案?

elasticsearch 中的类型通过向文档添加 _type 属性来工作,每次您搜索特定类型时,它都会自动按 _type 属性进行过滤。因此,在性能方面应该没有太大区别。类型是一种抽象而非实际数据。我在这里的意思是,跨多个文档类型的字段在整个索引上被展平,即一种类型的字段在其他类型的字段上也占据 space,即使它们没有被索引(认为是一样的) null 占据 space).

的方式

但请务必记住,过滤影响的顺序 performance.You 必须旨在一次性排除尽可能多的文档。所以,如果你认为最好不要先按类型过滤,那么优先过滤是更可取的。否则,如果顺序相同,我认为不会有太大差异。

由于 Python API 也在默认设置中通过 http 查询,使用 Python 应该不会影响性能。

这里,在您的情况下,尽管在 _type 元字段和颜色字段中都捕获了颜色,但存在一定程度的数据重复。