使用具有AND运算符的Nest ElasticSearch搜索查询

时间:2014-11-04 17:38:13

标签: c# elasticsearch nest

我试图搜索以下文字:

"女性持有" (注意""添加用于文本表示)

上述文字中我需要的是包含"女性"的所有项目。并且"举行"来自该领域的单词存储在弹性指数中。

我尝试的是:

 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));

但是上面的查询导致将任一项目作为&#34;女性&#34;或者&#34;举行&#34;来自&#34; summaryText&#34;但我想要的是&#34;女性和举办&#34;即两个文本都出现在&#34; summaryText&#34;字段。

如果这有意义,请告诉我。 我尝试了很多组合,但仍然没有成功。 Nest Guru的任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:1)

如果你想和#34;女人保持完全匹配&#34;在一个字段上然后不拆分字符串:

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

如果您正在寻找的是&#34;包含&#34;功能,然后您需要使用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);

答案 1 :(得分:0)

这就是我得到的解决方案,希望它可以帮助任何人尝试类似的ANDing搜索。 不是一种优雅的方式,但对我有用:

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));