2014-06-18 74 views
1

這是我的客戶端代碼:嵌套查詢返回奇怪的結果。 elasticsearch

設置

var defaultSettings = new ConnectionSettings(
    uri: new System.Uri("http://localhost:9200") 
); 

defaultSettings.SetJsonSerializerSettingsModifier(s => { 
    s.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
}); 

defaultSettings.SetConnectionStatusHandler(c => { 
    if(!c.Success) throw new Exception(c.ToString()); 
}); 

defaultSettings.SetDefaultIndex("projects"); 

執行代碼

public ActionResult Search(String searchTerm) { 
    var result = this.searchClient.Search<ProjectIndexModel>(
     descriptor: new SearchDescriptor<ProjectIndexModel>().Index("projects").AllTypes().Query(
      query: q => q.QueryString(qs => qs.Query(searchTerm) 
     ) 
    )); 

    // or 
    /* 
    var results = this.searchClient.Search<ProjectIndexModel>(s => 
     s.Index("projects").Type("project").Query(q => 
      q.Term(f => f.ProblemDefinition, searchTerm) || 
      q.Term(f => f.Name, searchTerm) || 
      q.Term(f => f.SuggestedSolution, searchTerm) || 
      q.Term(f => f.Initiator, searchTerm) 
     ) 
    );   
    */ 

    return Json(result.Documents.ToList()); 
} 

索引是在應用程序啓動啓動:

foreach(var project in this.dbContext.Projects) { 
    var indexModel = Mapper.Map<ProjectIndexModel>(project); 
    searchClient.Index(indexModel, "projects", "project", indexModel.Id.ToString()); 
} 

Indexes存在於數據庫中(這與我現在不完全相同,但架構保持不變)。

你有什麼我試圖

控制器動作返回(默認)10命中11個文件。這就像搜索被完全忽略,沒有可見的錯誤。

Fiddler了陽性結果(1次命中),既爲{host:9200}/_search{host:9200}/projects/project/_searchPOST請求與查詢:

{ 
    "query": { 
     "query_string": { 
      "query": "original" 
     } 
    } 
} 

什麼問題?

+0

對不起,我不知道c#。但是,如果您不指定默認字段,那麼在查詢字符串查詢中,您將最終搜索所有字段。如果您不指定默認操作員,您將搜索健康或護理。因此,文檔中任何位置的任何單詞都會使其匹配。 (我沒有訪問提供的鏈接,這裏,所以這只是一個猜測) – DeH

+0

但我的意圖是準確地搜索所有領域。爲什麼它返回結果,然後如果沒有匹配? – lexeme

+0

也許在這些文檔的另一個領域有健康或護理。即使是在你的文檔的任何字段上的「我愛鴨子」都會匹配。您是否肯定在一些匹配文檔中沒有這兩個詞出現? – DeH

回答

1

問題不在NEST。在探索results.ConnectionStatus.ToString()後,顯示Fiddler的命中,我發現問題出在我的客戶端代碼中。我忽略了,我發送POST沒有{searchTerm: $scope.searchTerm}指定:

$http({ 
    url: '/projects/search', 
    method: "POST", 
    data: { searchTerm: $scope.searchTerm } 
}) 
.success(function(data, status, headers, config) { 
    $scope.projects = data.documents; 
}).error(function(data, status, headers, config) { 
    console.log('error: ' + data); 
}); 
相關問題