Elasticsearch查询“空索引”

时间:2014-04-16 08:11:01

标签: exception search indexing elasticsearch mapping

在我的应用程序中,我使用了几个elasticsearch索引,它们在初始状态下不包含索引文档。我认为可以称之为“空”:) 文档的映射是正确且有效的。

该应用程序还有一个包含实体的关系数据库,MIGHT具有与elasticsearch相关联的文档。

在应用程序的初始状态中,通常只有没有文档的实体,因此没有索引单个文档,因此“空索引”。尽管如此,索引已经创建,并且文档的映射已经放入索引并存在于索引元数据中。

无论如何,当我使用SearchQuery查询elasticsearch以查找其中一个实体的文档时(该文档包含来自实体的唯一ID),elasticsearch将抛出一个ElasticSearchException,抱怨字段xy等没有映射。

但如果我首先在索引中插入一个空白文档,则查询不会失败。

有没有办法以某种方式“初始化”索引以防止查询失败并摆脱愚蠢的“虚拟文档解决方法”?

更新: 另外,使用虚拟文档的变通方法会污染索引,例如,计数查询现在总是返回+1 ....所以我也在变通方法中添加了删除...

2 个答案:

答案 0 :(得分:4)

您的问题缺乏细节,不清楚。如果您提供了索引架构和查询的要点,那将会有所帮助。您还应该提供正在使用的elasticsearch版本。

"没有映射"您提到的异常与使用某些数据初始化索引无关。很可能你正在对不存在的领域进行排序。如果您一次查询多个索引,这很常见。

解决方案:解决方案基于elasticsearch的版本。如果您使用 1.3.x或更低,则应使用ignore_unmapped。如果您使用的版本大于1.3.5 ,则应使用unmapped_typeClick here to read official documentation.

如果您发现文档令人困惑,那么此示例将清楚说明:

让我们创建两个索引 testindex1 testindex2

curl -XPUT localhost:9200/testindex1 -d '{"mappings":{"type1":{"properties":{"firstname":{"type":"string"},"servers":{"type":"nested","properties":{"name":{"type":"string"},"location":{"type":"nested","properties":{"name":{"type":"string"}}}}}}}}}'

curl -XPUT localhost:9200/testindex2 -d '{"mappings":{"type1":{"properties":{"firstname":{"type":"string"},"computers":{"type":"nested","properties":{"name":{"type":"string"},"location":{"type":"nested","properties":{"name":{"type":"string"}}}}}}}}}'

这两个指数之间的唯一区别是 - testindex1 有" server"字段和 textindex2 有" computers"领域。

现在让我们在两个索引中插入测试数据。

testindex1 的索引测试数据:

curl -XPUT localhost:9200/testindex1/type1/1 -d '{"firstname":"servertom","servers":[{"name":"server1","location":[{"name":"location1"},{"name":"location2"}]},{"name":"server2","location":[{"name":"location1"}]}]}'

curl -XPUT localhost:9200/testindex1/type1/2 -d '{"firstname":"serverjerry","servers":[{"name":"server2","location":[{"name":"location5"}]}]}'

testindex2 的索引测试数据:

curl -XPUT localhost:9200/testindex2/type1/1 -d '{"firstname":"computertom","computers":[{"name":"computer1","location":[{"name":"location1"},{"name":"location2"}]},{"name":"computer2","location":[{"name":"location1"}]}]}'

curl -XPUT localhost:9200/testindex2/type1/2 -d '{"firstname":"computerjerry","computers":[{"name":"computer2","location":[{"name":"location5"}]}]}'

查询示例:

  1. 使用" unmapped_type"对于elasticsearch版本> 1.3.x中

        curl -XPOST 'localhost:9200/testindex2/_search?pretty' -d '{"fields":["firstname"],"query":{"match_all":{}},"sort":[{"servers.location.name":{"order":"desc","unmapped_type":"string"}}]}'
    
  2. 使用" ignore_unmapped"对于elasticsearch版本< = 1.3.5

    curl -XPOST 'localhost:9200/testindex2/_search?pretty' -d '{"fields":["firstname"],"query":{"match_all":{}},"sort":[{"servers.location.name":{"order":"desc","ignore_unmapped":"true"}}]}'
    
  3. query1的

    输出

    {
      "took" : 15,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
      },
      "hits" : {
        "total" : 2,
        "max_score" : null,
        "hits" : [ {
          "_index" : "testindex2",
          "_type" : "type1",
          "_id" : "1",
          "_score" : null,
          "fields" : {
            "firstname" : [ "computertom" ]
          },
          "sort" : [ null ]
        }, {
          "_index" : "testindex2",
          "_type" : "type1",
          "_id" : "2",
          "_score" : null,
          "fields" : {
            "firstname" : [ "computerjerry" ]
          },
          "sort" : [ null ]
        } ]
      }
    }
    
    query2的

    输出

    {
      "took" : 10,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
      },
      "hits" : {
        "total" : 2,
        "max_score" : null,
        "hits" : [ {
          "_index" : "testindex2",
          "_type" : "type1",
          "_id" : "1",
          "_score" : null,
          "fields" : {
            "firstname" : [ "computertom" ]
          },
          "sort" : [ -9223372036854775808 ]
        }, {
          "_index" : "testindex2",
          "_type" : "type1",
          "_id" : "2",
          "_score" : null,
          "fields" : {
            "firstname" : [ "computerjerry" ]
          },
          "sort" : [ -9223372036854775808 ]
        } ]
      }
    }
    

    注意:

    1. 这些示例是在elasticserch 1.4上创建的。
    2. 这些示例还演示了如何对嵌套字段进行排序。

答案 1 :(得分:2)

你在搜索时做了什么?我遇到了同样的问题("No mapping found for [field] in order to sort on"),但只是在尝试对结果进行排序时。在这种情况下,解决方案只是将ignore_unmapped: true属性添加到查询中的sort参数:

{
  ...
  "body": {
    ...
    "sort": [
      {"field_name": {
        "order": "asc",
        "ignore_unmapped": true
      }}
    ]
    ...
  }
  ...
}

我在这里找到了解决方案: No mapping found for field in order to sort on in ElasticSearch