-
正常来说,搜索的需求一般是我们传入一个keyword(和需要搜索的field name),返回符合条件的列表,那么搜索就分为全文搜索和单属性搜索。顾名思义,全文搜索就是用keyword去匹配所有的属性,单属性搜索就是只匹配指定的属性。
-
全文搜索:
-
-
-
keyword = String.Format("*{0}*", keyword);
-
//默认的Operator是Or,当keyword是类似于"One Two"之类的中间有空格的时候,会被当成两个关键词搜索,然后搜索结果进行or运算
-
//所以我们需要根据需求来调整Operator
-
-
var searchResults = client.Search<T>(s => s
-
.Index(index)
-
.Query(q => q.QueryString(qs => qs.Query(keyword).DefaultOperator(Operator.And)))
-
);
-
-
return searchResults.Documents;
-
-
另外由于ES是分词搜索,所以当我们要用"One"来搜索完整的单词"JustOne"的时候,就必须在"One"外面添加**,类似于SQL里面的%keyword%,但是这样的做法会导致在用完整的单词来搜索的时候搜索不到结果,所以我们需要使用下面的方式(如果有更好的方法请不吝赐教):
-
-
-
wholeKeyword = keyword;
-
keyword = String.Format("*{0}*", keyword);
-
QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.And };
-
if(!String.IsNullOrEmpty(wholeKeyword)){
-
QueryContainer wholeWordQuery = new QueryStringQuery() { Query = wholeKeyword };
-
query = query || wholeWordQuery;
-
}
-
var searchResults = client.Search<Person>(s => s
-
.Index("zhixiao-application")
-
.Query(query)
-
);
-
-