2014-11-04 66 views
0

我試圖尋找下列文字巢ElasticSearch查詢:搜索與載有運營商

「舉辦的婦女」(請注意「」添加文本表示)

我需要的東西從上面的文字是所有包含存儲在彈性索引中的字段中的「女性」和「保留」單詞的項目。

我想什麼:

string searchText = "women held"; 
var filterQuery = Query<T>.Terms("summaryText", searchText.Split(' ')); 
var result = Client.Search<T>(s => s.Index(IndexName).Query(filterQuery).Size(1000)); 

但上面的查詢結果中獲得任何的項目爲「女性」或「保持」,從「summaryText」領域,但我要的是「婦女和舉行「即兩個文本都出現在」summaryText「字段中。

請讓我知道這是否合理。 我嘗試了很多組合,但仍然沒有成功。 Nest Guru的任何人都可以幫忙嗎?

回答

0

這是我得到的解決方案,希望這將有助於任何人試圖類似的取與搜索。 嘛不是一種優雅的方式,但對我的作品:

string searchText = "women held"; 
string[] splitSearch = searchText.Split(' '); 
List<QueryContainer> searchQueryList = new List<QueryContainer>(); 
foreach(var strText in splitSearch) 
{ 
    searchQueryList.Add(Query<T>.Term("summaryText", strText)); 
} 

var filterQuery = Query<T>.Bool(b=> b.Must(searchQueryList.ToArray())); 
var result = Client.Search<T>(s => s.Index(IndexName).Query(filterQuery).Size(1000)); 
1

如果你想要在一個領域的「女人召開的」精確匹配那麼不分割字符串:

string searchText = "women held"; 
var filterQuery = Query<T>.Terms("summaryText", searchText); 
var result = Client.Search<T>(s => s.Index(IndexName).Query(filterQuery).Size(1000)); 

如果你正在尋找的是一個「包含」功能,那麼你需要使用一個regexp查詢(但有一個性能開銷,如果你的數據是巨大的):

SearchDescriptor<T> descriptor = new SearchDescriptor<T>(); 
descriptor = descriptor.Index(IndexName).Size(1000) 
    .Query(query => query 
     .Regexp(r => r.OnField("summaryText").Value(".*" + "woman held" + ".*"))); 
var result = ElasticClient().Search<T>(s => descriptor); 
+0

感謝@gsk那是一個不錯的黑客,但我的指標是真正具有巨大外卡的正則表達式鐵定減慢執行。剛纔我嘗試了一些其他的東西,它工作。不知道爲什麼Nest .Net不提供。我會發佈一個答案。 – 2014-11-06 15:44:57