NEST无法找到弹性搜索可以找到的文档

时间:2014-02-25 18:08:51

标签: c# asp.net-mvc-4 nest

这是我搜索文档的方式,但它不会返回任何结果:

var results = ElasticClient.Search<ClusterInstance>(body => body
    .AllIndices()
    .Size(500)
    .Query(query => query
        .QueryString(qs => qs.Query("MyTestName"))
    )
);
resultobject.clusterinstances = results.Documents.ToList();

当我在Elasticsearch中使用它作为搜索查询时,我得到了我需要的结果(其中2个)。

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "MyTestName"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 10,
  "sort": [],
  "facets": {}
}

创建ElasticClient:

private static ElasticClient ElasticClient
{
    get
    {
        var uri = new Uri("http://localhost:9200")
        return new ElasticClient(new ConnectionSettings(uri));
    }
}

索引:

foreach (var cluster in db.ClusterInstances.Where(a => a.Active.Equals(true)))
{
    client.Index(cluster, "cmdbcli", "clusters", cluster.ClusterInstanceID);
}

版本:NEST - Elasticsearch Client 0.12.0(NuGet)

2 个答案:

答案 0 :(得分:4)

虽然Chris Mantle认为查询不完全匹配,但它们几乎应该在功能上相同。

您的搜索正在/_all/clusterinstances/_search搜索您可能想要的内容:

.Search(s=>s
    .AllIndices()
    .AllTypes()
    ...

.Search(s=>s
    .AllIndices()
    .Type("clusters")
    ...

默认情况下,NEST通过小写和复数化CLR类型名来推断弹性搜索类型。

如果你设置了这样的连接设置:

var settings = new ConnectionSettings(uri)
    .SetDefaultIndex("cmdbcli")
    .MapDefaultTypeNames(d=>d
       .Add(typeof(ClusterInstance), "clusters")
    )
   ....

然后

.Search<ClusterInstance>(s=>s.Query())

将默认为/cmdbcli/clusters/_search

答案 1 :(得分:1)

您的查询不匹配。您的代码生成的查询将是一个简单的query_string查询,而不是您在JSON查询中定义的bool查询。我认为您需要更改代码以生成与您在JSON中定义的代码类似的查询:

var results = ElasticClient
    .Search<ClusterInstance>(body => body
        .AllIndices()
        .Size(500)
        .Query(query => query
            .Bool(@bool => @bool
                .Must(must => must
                    .QueryString(qs => qs
                        .Query("MyTestName"))))));

resultobject.clusterinstances = results.Documents.ToList();