ElasticSearch NEST查询

时间:2015-03-31 19:23:35

标签: elasticsearch nest sense elasticsearch-net

我试图使用C#中的NEST模仿我在Sense(chrome插件)中编写的查询。我无法弄清楚这两个查询之间的区别是什么。 Sense查询返回记录,而嵌套查询则不返回。查询如下:

var searchResults = client.Search<File>(s => s.Query(q => q.Term(p => p.fileContents, "int")));

{
"query": {
    "term": {
       "fileContents": {
          "value": "int"
       }
    }
}

这两个查询有什么区别?为什么一个人会返回记录而另一个没有?

3 个答案:

答案 0 :(得分:6)

您可以使用以下代码找出NEST使用的查询:

var json = System.Text.Encoding.UTF8.GetString(searchResults.RequestInformation.Request);

然后你可以比较输出。

答案 1 :(得分:6)

我更喜欢这个稍微简单的版本,我通常只在.NET立即窗口中输入:

searchResults.ConnectionStatus;

除了缩短之外,它还提供了网址,这可能非常有用。

? searchResults.ConnectionStatus;
{StatusCode: 200, 
    Method: POST, 
    Url: http://localhost:9200/_all/filecontent/_search, 
    Request: {
  "query": {
    "term": {
      "fileContents": {
        "value": "int"
      }
    }
  }
}

答案 2 :(得分:4)

试试这个:

var searchResults2 = client.Search<File>(s => s
    .Query(q => q
        .Term(p => p.Field(r => r.fileContents).Value("int")
    )
));
  

跟进:

     
      
  1. RequestInformation在较新版本的NEST中不可用。
  2.   
  3. 我建议分步你的代码(不要直接在client.Search()方法中构建查询。
  4.   

client.Search()将Func<SearchDescriptor<T>, ISearchRequest>作为输入(参数)。

我的答案来自similar post

SearchDescriptor<T> sd = new SearchDescriptor<T>()
.From(0).Size(100)
    .Query(q => q
        .Bool(t => t
            .Must(u => u
                .Bool(v => v
                    .Should(
                        ...
                    )
                )
            )
        )
    );

得到了反序列化的JSON:

{
  "from": 0,
  "size": 100,
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              ...
            ]
          }
        }
      ]
    }
  }
}

这很烦人,NEST库应该有一些东西从请求中吐出JSON。然而,这对我有用:

using (MemoryStream mStream = new MemoryStream()) {
    client.Serializer.Serialize(sd, mStream);
    Console.WriteLine(Encoding.ASCII.GetString(mStream.ToArray()));
}

NEST库版本:2.0.0.0。 较新的版本可能有一个更简单的方法来获得这个(希望)。