2015-03-31 154 views
3

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

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

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

是什么这两个查询之间的区别?为什么会返回记录而另一个不是?

+0

请提及'client'的完整定义。 – bittusarkar 2015-03-31 19:53:23

回答

6

您可以找出查询NEST与下列代码:

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

然后,你可以比较的输出。

+0

'.RequestInformation'不再适用于来自查询的响应。有没有其他办法可以做到这一点。 – ASN 2016-06-29 10:13:59

+2

这对于当前版本的NEST不起作用 – 2016-10-18 18:52:42

6

我喜欢这种稍微简单的版本,我通常只需键入.NET立即窗口:

searchResults.ConnectionStatus; 

除了是较短的,这也给了网址,这是相当有帮助的。

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

试试这个:

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

跟帖:

  1. RequestInformation不NEST的新版本。
  2. 我建议在步骤(在client.Search不要直接建立查询打破你的代码()方法。

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。 新版本可能有一个更简单的方法来获得这个(希望)。