【问题标题】:NEST not able to find documents that elastic search can findNEST 无法找到弹性搜索可以找到的文档
【发布时间】:2014-02-26 03:40:42
【问题描述】:

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

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 客户端 0.12.0 (NuGet)

【问题讨论】:

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


    【解决方案1】:

    虽然 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

    【讨论】:

    • 是的!而已!谢谢!
    【解决方案2】:

    您的查询不匹配。您的代码生成的查询将是一个简单的 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();
    

    【讨论】:

      猜你喜欢
      • 2022-08-12
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多