NEST elasticsearch.NET搜索查​​询未返回结果(第2部分)

时间:2015-05-20 15:34:39

标签: elasticsearch nest elasticsearch-plugin

我正在使用NEST的对象初始化器语法来形成搜索查询。当我使用逻辑OR运算符包含第二个pdfQuery时,我得不到任何结果。如果我将其排除,我会得到结果。

QueryContainer titleQuery = new MatchQuery
{
    Field = Property.Path<ElasticBook>(p => p.Title),
    Query = query,
    Boost = 50,
    Slop = 2,
    MinimumShouldMatch = "55%"
};

QueryContainer pdfQuery = new MatchQuery
{
    Field = Property.Path<ElasticBook>(p => p.Pdf),
    Query = query,
    CutoffFrequency = 0.001
};

var result = _client.Search<ElasticBook>(new SearchRequest("bookswithstop", "en")
{
    From = 0,
    Size = 10,
    Query = titleQuery || pdfQuery,
    Timeout = "20000",
    Fields = new []
    {
      Property.Path<ElasticBook>(p => p.Title)  
    } 
});

如果我调试并检查结果var,我将其中一个请求属性复制到get:

{
 "timeout": "20000",
 "from": 0,
 "size": 10,
 "fields": [
   "title"
 ],
 "query": {
   "bool": {
     "should": [
       {
         "match": {
           "title": {
             "query": "Proper Guide To Excel 2010",
             "slop": 2,
             "boost": 50.0,
             "minimum_should_match": "55%"
           }
         }
       },
       {
         "match": {
           "pdf": {
             "query": "Proper Guide To Excel 2010",
             "cutoff_frequency": 0.001
           }
         }
       }
     ]
   }
 }
}

问题在于,如果我将该查询复制到意义上 - 它会返回大约100个结果(虽然很慢)。我已经检查了标题信息,这似乎也是正确的NEST:

ConnectionStatus = {StatusCode: 200, 
    Method: POST, 
    Url: http://elasticsearch-blablablamrfreeman/bookswithstop/en/_search, 
    Request: {
  "timeout": "20000",
  "from": 0,
  "size": 10,
  "fields": [
    "title"
  ],
  "query": {
    "bool": {
      "shoul...

pdf字段使用弹性搜索附件插件(位于@ https://github.com/elastic/elasticsearch-mapper-attachments),之前我被抛出Newtonsoft.JSON system.outofmemoryexceptions(但由于某种原因现在没有)。

我唯一的建议是,通过我的查询和NEST可能存在一些序列化问题?如果是这种情况,我不确定为什么它只能用200代码成功执行并在Documents属性中提供0个文档

有人可以向我解释一下我将如何解决这个问题吗?它显然不喜欢我的第二个搜索查询(pdfQuery),但我不确定为什么 - 并且结果JSON请求语​​法似乎也是正确的!

1 个答案:

答案 0 :(得分:1)

我认为这部分导致了问题

Fields = new []
    {
      Property.Path<ElasticBook>(p => p.Title)  
    } 

您何时使用Fields选项,弹性搜索不返回_source字段,因此您无法通过result.Documents访问结果。相反,你必须使用result.FieldSelections,这是非常不愉快的。

如果您只想返回elasticsearch中的特定字段,并且仍然可以使用result.Documents,则可以利用source includes / excludes。使用NEST,您可以执行以下操作:

var searchResponse = client.Search<Document>(s => s
    .Source(source => source.Include(f => f.Number))
    .Query(q => q.MatchAll()));

希望这会对你有所帮助。