0

我正在升级到 NEST 2.3.0 并尝试重写最初为 NEST 1.x 编写的所有查询。我正在使用将数据从 Couchbase 推送到 Elasticsearch 的 Couchbase 传输插件。

POCO

 public class Park
    {
        public Park()
        {

        }

        public bool IsPublic { get; set; }
    }

映射是这样的

"mappings": {
"park": {
            "_source": {
                "includes": [
                  "doc.*"
                ],
                "excludes": [
                  "meta.*"
                ]
            },
            "properties": {
                "meta": {
                    "properties": {
                        "rev": {
                            "type": "string"
                        },
                      "flags": {
                        "type": "long"
                      },
                      "expiration": {
                        "type": "long"
                      },
                      "id": {
                        "type": "string",
                        "index": "not_analyzed"
                      }
                    }
                },
              "doc": {
                "properties": {

                  "isPublic": {
                    "type": "boolean"
                  }
                }
              }
            }
        }
      }

elasticsearch中的示例文档

    {
  "_index": "parkindex-local-01",
  "_type": "park",
  "_id": "park_GUID",
  "_source": {
    "meta": {
      "expiration": 0,
      "flags": 33554433,
      "id": "park_GUID",
      "rev": "1-1441a2c278100bc00000000002000001"
    },
    "doc": {
      "isPublic": true,
      "id": "park_GUID"
    }
  }
}

我在 NEST 中的查询

 var termQuery = Query<Park>.Term(p => p.IsPublic, true);
        ISearchResponse<T> searchResponse = this.client.Search<T>(s => s.Index("parkindex-local-01")
                     .Take(size)
                     .Source(false)
                     .Query(q => termQuery));

此查询转到 Elasticsearch,如下所示

{
  "size": 10,
  "_source": {
    "exclude": [
      "*"
    ]
  },
  "query": {
    "term": {
      "isPublic": {
        "value": "true"
      }
    }
  }
}

它不检索任何数据,只有当我在字段名称前加上“doc”前缀时它才会起作用。所以查询变成如下

{
  "size": 10,
  "_source": {
    "exclude": [
      "*"
    ]
  },
  "query": {
    "term": {
      "doc.isPublic": {
        "value": "true"
      }
    }
  }
}

如何在 NEST 中编写上面的查询,以便它可以正确解释字段名称,我尝试使用路径设置为“doc”的嵌套查询,但这给出了一个错误,指出字段不是嵌套类型。

我需要更改我的映射吗?

这一切都曾经在 Elasticsearch 1.x 和 NEST 1.x 中工作,我想这与对字段名称约束的破坏性更改有关。

4

1 回答 1

0

在 Elasticsearch 2.0 中,字段不能再被短名称引用。

isPublicdoc字段的一个属性,它被映射为一种object类型,因此通过属性的完整路径引用是正确的做法。

NEST 2.x 有一些方法可以帮助进行场推断,例如

public class Park
{
    public Doc Doc { get; set;}
}

public class Doc
{
    public bool IsPublic { get; set;}
}

var termQuery = Query<Park>.Term(p => p.Doc.IsPublic, true);

client.Search<Park>(s => s.Index("parkindex-local-01")
             .Take(10)
             .Source(false)
             .Query(q => termQuery));

结果是

{
  "size": 10,
  "_source": {
    "exclude": [
      "*"
    ]
  },
  "query": {
    "term": {
      "doc.isPublic": {
        "value": true
      }
    }
  }
}

您可能还想查看自动映射文档

于 2016-05-03T02:23:13.260 回答