Elastic Search 5.x Nest Multiple Queries C#
I'm using C# with those nuget packeges;
<package id="Elasticsearch.Net" version="5.2.0" targetFramework="net462" />
<package id="NEST" version="5.2.0" targetFramework="net462" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net462" />
What I want to do here, I want to get "white" items in price range 2000 - 3000. It's a simple request for a search api, am I right ?
So I wrote a code for this. Here it is;
private static void Search(IElasticContext elasticContext, string indexName)
{
IQueryContainer termQueryContainer = new QueryContainer();
termQueryContainer.Term = new TermQuery
{
Field = new Field("description"),
Value = "white"
};
IQueryContainer rangeQueryContainer = new QueryContainer();
rangeQueryContainer.Range = new NumericRangeQuery
{
Field = new Field("price"),
LessThanOrEqualTo = 3000,
GreaterThanOrEqualTo = 2000
};
//Should get 2 items.
SearchRequest<Product> searchRequest = new SearchRequest<Product>(indexName, typeof(Product))
{
Size = 10,
From = 0,
Query = (QueryContainer) rangeQueryContainer,
PostFilter = (QueryContainer) termQueryContainer
};
EsSearchResponse<Product> response = elasticContext.Search<Product>(searchRequest);
Console.WriteLine(response.StatusMessage);
if (response.IsValid)
{
foreach (Product product in response.Documents)
{
Console.WriteLine("Id: {0} | Name: {1}", product.Id, product.Name);
}
}
}
But it doesn't work because request has been successfull but there is no document(s) in the result, but I have. I can see the docs with Sense plugin.
If I combine two queries, nest will throw exception in runtime ( Says: "QueryContainer can only hold a single query already contains a TermQuery" ). Here it is;

Also, I can't use fluent api, because I pass the parameters to my repository-like function;
EsSearchResponse<Product> response = elasticContext.Search<Product>(searchRequest);
How can I combine two simple queries ( search in description field & price range between 2000-3000 ) in SearchRequest of Nest dll. And what am I doing wrong?
Answer
What you're trying to do is form a compound query from two queries, where both queries must be satisfied by a document in order for it to be considered a match. A bool query is used to combine queries in this manner, using the must clause to specify both queries must be satisfied. Here's an example, with the object initializer syntax
var client = new ElasticClient();
var indexName = "index-name";
var mustClauses = new List<QueryContainer>();
mustClauses.Add(new TermQuery
{
Field = new Field("description"),
Value = "white"
});
mustClauses.Add(new NumericRangeQuery
{
Field = new Field("price"),
LessThanOrEqualTo = 3000,
GreaterThanOrEqualTo = 2000
});
var searchRequest = new SearchRequest<Product>(indexName)
{
Size = 10,
From = 0,
Query = new BoolQuery { Must = mustClauses }
};
var searchResponse = client.Search<Product>(searchRequest);
With the range query, a document is either a match for the query clause or not, so we can forgo a score being calculated for the query by adding it as a bool query filter clause
var indexName = "index-name";
var mustClauses = new List<QueryContainer>();
var filterClauses = new List<QueryContainer>();
mustClauses.Add(new TermQuery
{
Field = new Field("description"),
Value = "white"
});
filterClauses.Add(new NumericRangeQuery
{
Field = new Field("price"),
LessThanOrEqualTo = 3000,
GreaterThanOrEqualTo = 2000
});
var searchRequest = new SearchRequest<Product>(indexName)
{
Size = 10,
From = 0,
Query = new BoolQuery
{
Must = mustClauses,
Filter = filterClauses
}
};
var searchResponse = client.Search<Product>(searchRequest);
Elastic Search 5.x Nest Multiple Queries C#的更多相关文章
- Getting Started with Elastic Search in .NET
I have been working on many application during my career. Many if not all had some searching capabi ...
- Elastic Search操作入门
前言 Elastic Search是基于Lucene这个非常成熟的索引方案,另加上一些分布式的实现:集群,sharding,replication等.具体可以参考我同事写的文章. 本文主要介绍ES入门 ...
- elastic search查询命令集合
Technorati 标签: elastic search,query,commands 基本查询:最简单的查询方式 query:{"term":{"title" ...
- elastic search 学习笔记
Elastic search在数据分析的应用中相当于一个数据库的搜索引擎. 跟MySQL类似,它有自己的查询语言,只不过不是关系型数据库,属于NoSQL. 可以根据索引从分布式服务器文件系统中快速存取 ...
- elastic search 学习 一
初步阅读了elastic search 的文档,并使用command实践操作. 大概明白其概念模型.
- 分库分表后跨分片查询与Elastic Search
携程酒店订单Elastic Search实战:http://www.lvesu.com/blog/main/cms-610.html 为什么分库分表后不建议跨分片查询:https://www.jian ...
- 自学elastic search
工作也有一段时间了,虽然来这个公司之后学会了几门不同的语言,但想拨尖还是任重道远. 想往高级程序员甚至是架构师方向发展.他仍然是我的学习对象.我现在做着的,无非是他玩剩下的罢了. luncene之前有 ...
- Elastic Search 上市了,市值翻倍,这群人财务自由了!
国庆长假,大部分人还深浸在风花雪月之中,而就在昨天(美国时间10月5号),我们 Java 程序员所熟知的大名鼎鼎的 Elastic Search 居然在美国纽约证券交易所上市了! 当说到搜索时,大部分 ...
- Elastic Search 安装和配置
目标 部署一个单节点的ElasticSearch集群 依赖 java环境 $java -version java version "1.8.0_161" Java(TM) SE R ...
随机推荐
- javascript中的属性类型
ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特性.ECMA-262定义这些特性是为了实现javascript引擎用的,因此在javasc ...
- NBU 还原windows ORACLE数据库(BW)
将0.92数据库还原到1.92,还原时间7月13日 1.查询所需要的控制日志 bplist -C bw-prd01 -s -- -e -- -k oracle_bw-prd01_0_92_arch - ...
- PLSQL启动很慢的问题
最近重新做了系统,win7 64位系统上装了oracle10g,plsql10.发现plsql启动比较慢. 解决方法: 首先停止打印机服务:Print Spooler,然后将这个服务设置为手动模式.
- FIX protocol tutorial : Fix Session is not connecting how to diagnose it ?
In this blog post of FIX protocol tutorial series I would like to share my experience with connectiv ...
- 报错提示:mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in..的处理方式
PHP操作数据库的时候如果出现报错: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in.. ...
- Luogu 4491 [HAOI2018]染色
BZOJ 5306 考虑计算恰好出现$s$次的颜色有$k$种的方案数. 首先可以设$lim = min(m, \left \lfloor \frac{n}{s} \right \rfloor)$,我们 ...
- Zookeeper 源码(六)Leader-Follower-Observer
Zookeeper 源码(六)Leader-Follower-Observer 上一节介绍了 Leader 选举的全过程,本节讲解一下 Leader-Follower-Observer 服务器的三种角 ...
- Web01 基础
网址组成(四部分) 协议 http,https (https是加密的http) 主机 g.cn zhihu.com之类的网址 端口 HTTP协议默认80,因此一般不用填写 路径 下面的 / 和 / ...
- Java设计模式(9)——观察者模式
一.观察者模式定义 Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态. Observer模式提供给关联对象一种同步通信的手段,使某个 ...
- FPGA时序约束和timequest timing analyzer
FPGA时序约束 时钟约束 #************************************************************** # Create Clock #****** ...