2014-01-15 97 views
1

我無法通過特定術語搜索文檔。每次我都會得到零結果。通過使用NEST客戶端的術語查詢進行搜索以進行彈性搜索

這裏是一個代碼示例:使用這個指標,我可以使用查詢字符串過濾器

var queryByQueryString = _elasticClient.Search<SampleCustomer>(s => 
      s.From(0).Size(10).Type("SampleCustomers") 
      .Query(q => q.QueryString(qs => qs.Query("Smith").OnField("surname")))); 

查詢客戶與史密斯的名字,但如果我試圖尋找客戶

var customers = new List<SampleCustomer>(); 
customers.Add(new SampleCustomer(){id=1,firstname="John", surname="Smith", country = "UK", sex = "Male", age=30}); 
customers.Add(new SampleCustomer(){id=2,firstname="Steve", surname="Jones", country ="UK", sex = "Male", age=22}); 
customers.Add(new SampleCustomer(){id=3,firstname="Kate", surname="Smith", country ="UK", sex = "Female", age=50}); 
customers.Add(new SampleCustomer(){id=4,firstname="Mark", surname="Jones", country ="USA", sex = "Male", age=45}); 
customers.Add(new SampleCustomer(){id=5,firstname="Emma", surname="Jonson", country ="USA", sex = "Female", age=25}); 
customers.Add(new SampleCustomer(){id=6,firstname="Tom", surname="Jones", country ="France", sex = "Male", age=30}); 
customers.Add(new SampleCustomer(){id=7,firstname="Liz", surname="Web", country ="France", sex = "Female", age=45}); 

foreach (var customer in customers) 
{ 
    _elasticClient.DeleteById("sample", "SampleCustomers",customer.id); 
    _elasticClient.Index(customer, "sample", "SampleCustomers" , customer.id); 
} 

使用術語過濾器,我得到結果爲零

var queryByTerm = _elasticClient.Search<SampleCustomer>(s => 
      s.From(0).Size(10).Type("SampleCustomers") 
      .Query(q => q.Term(p => p.surname, "Smith"))); 

我不知道我在做什麼錯?在上面的例子中,我想確保我的查詢只返回姓氏正好等於「Smith」的結果,並且如果某人有一個雙管姓例如「Smith Jones」,他們就不會出現在結果中。

回答

5

很難確切地知道沒有看到您的映射,但您的問題可能只是區分大小寫。如果"surname"字段正在使用默認的standard analyzer(除非您在映射中指定了一個),則令牌被修改爲小寫。所以會有一個"smith"令牌,但不會有"Smith"。當您使用查詢字符串查詢時,將分析您的查詢文本(使用standard分析儀,除非您提供一個),因此搜索文本將被修改爲與符號相匹配的"smith"。但term filter不做任何分析,並且篩選文本"Smith"不匹配任何令牌,因此不會返回任何結果。

如果這確實是你的問題,那麼這應該返回結果:

var queryByTerm = _elasticClient.Search<SampleCustomer>(s => 
      s.From(0).Size(10).Type("SampleCustomers") 
      .Query(q => q.Term(p => p.surname, "smith"))); 

或者,你可以設置"surname"領域"index": "not_analyzed"在映射(將需要重新索引)等令牌意志不要小寫,而且您的文字過濾器"Smith"會匹配。

+0

謝謝是的小寫工作。我不能讓它與史密斯一起工作。我確實添加了not_analysed屬性到Sample customer類的surname屬性,但它沒有改變任何東西。 例如 [ElasticProperty(Index = FieldIndexOption.not_analyzed)] public string surname {get;組; } – Steve

+0

您是否使用新映射重新編制索引?你確定它有效嗎?你可以發佈映射嗎?沒有看到映射,很難知道什麼是錯的。我對Nest並不熟悉,但只需點擊http:// [endpoint]/[index_name]/_mapping即可獲得映射 –

相關問題