elasticsearch------java操作之QueryBuilders构建搜索Query
版权声明:本文为非原创文章,出处:http://blog.csdn.net/xiaohulunb/article/details/37877435。
elasticsearch 分布式搜索系列专栏:http://blog.csdn.net/xiaohulunb/article/category/2399789
内容涉及代码GitHub地址: 点击打开链接
官方API:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/query-dsl-queries.html
- package com.elasticsearch;
- import org.elasticsearch.action.ActionListener;
- import org.elasticsearch.action.search.SearchResponse;
- import org.elasticsearch.index.query.IndicesQueryBuilder;
- import org.elasticsearch.index.query.QueryBuilder;
- import org.elasticsearch.index.query.QueryBuilders;
- /**
- * Created by lw on 14-7-15.
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * elasticsearch以提供了一个完整的Java查询dsl其余查询dsl。
- * QueryBuilders工厂构建
- * API:
- * <a>http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/query-dsl-queries.html</a>
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- public class Es_QueryBuilders_DSL {
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * match query 单个匹配
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder matchQuery() {
- return QueryBuilders.matchQuery("name", "葫芦4032娃");
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * multimatch query
- * 创建一个匹配查询的布尔型提供字段名称和文本。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder multiMatchQuery() {
- //现住址和家乡在【山西省太原市7429街道】的人
- return QueryBuilders.multiMatchQuery(
- "山西省太原市7429街道", // Text you are looking for
- "home", "now_home" // Fields you query on
- );
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * boolean query and 条件组合查询
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder booleanQuery() {
- return QueryBuilders
- .boolQuery()
- .must(QueryBuilders.termQuery("name", "葫芦3033娃"))
- .must(QueryBuilders.termQuery("home", "山西省太原市7967街道"))
- .mustNot(QueryBuilders.termQuery("isRealMen", false))
- .should(QueryBuilders.termQuery("now_home", "山西省太原市"));
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * ids query
- * 构造一个只会匹配的特定数据 id 的查询。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder idsQuery() {
- return QueryBuilders.idsQuery().ids("CHszwWRURyK08j01p0Mmug", "ojGrYKMEQCCPvh75lHJm3A");
- }
- /**
- * TODO NotSolved
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * constant score query
- * 另一个查询和查询,包裹查询只返回一个常数分数等于提高每个文档的查询。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder constantScoreQuery() {
- /*return // Using with Filters
- QueryBuilders.constantScoreQuery(FilterBuilders.termFilter("name", "kimchy"))
- .boost(2.0f);*/
- // With Queries
- return QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("name", "葫芦3033娃"))
- .boost(2.0f);
- }
- /**
- * TODO NotSolved
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * disjunction max query
- * 一个生成的子查询文件产生的联合查询,
- * 而且每个分数的文件具有最高得分文件的任何子查询产生的,
- * 再加上打破平手的增加任何额外的匹配的子查询。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder disMaxQuery() {
- return QueryBuilders.disMaxQuery()
- .add(QueryBuilders.termQuery("name", "kimchy")) // Your queries
- .add(QueryBuilders.termQuery("name", "elasticsearch")) // Your queries
- .boost(1.2f)
- .tieBreaker(0.7f);
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * fuzzy query
- * 使用模糊查询匹配文档查询。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder fuzzyQuery() {
- return QueryBuilders.fuzzyQuery("name", "葫芦3582");
- }
- /**
- * TODO NotSolved
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * has child / has parent
- * 父或者子的文档查询
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder hasChildQuery() {
- return // Has Child
- QueryBuilders.hasChildQuery("blog_tag",
- QueryBuilders.termQuery("tag", "something"));
- // Has Parent
- /*return QueryBuilders.hasParentQuery("blog",
- QueryBuilders.termQuery("tag","something"));*/
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * matchall query
- * 查询匹配所有文件。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder matchAllQuery() {
- return QueryBuilders.matchAllQuery();
- }
- /**
- * TODO NotSolved
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * more like this (field) query (mlt and mlt_field)
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder moreLikeThisQuery() {
- // mlt Query
- QueryBuilders.moreLikeThisQuery("home", "now_home") // Fields
- .likeText("山西省太原市7429街道") // Text
- .minTermFreq(1) // Ignore Threshold
- .maxQueryTerms(12); // Max num of Terms
- // in generated queries
- // mlt_field Query
- return QueryBuilders.moreLikeThisFieldQuery("home") // Only on single field
- .likeText("山西省太原市7429街道")
- .minTermFreq(1)
- .maxQueryTerms(12);
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * prefix query
- * 包含与查询相匹配的文档指定的前缀。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder prefixQuery() {
- return QueryBuilders.prefixQuery("name", "葫芦31");
- }
- /**
- * TODO NotSolved
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * querystring query
- * 查询解析查询字符串,并运行它。有两种模式,这种经营。
- * 第一,当没有添加字段(使用{ @link QueryStringQueryBuilder #字段(String)},将运行查询一次,非字段前缀
- * 将使用{ @link QueryStringQueryBuilder # defaultField(字符串)}。
- * 第二,当一个或多个字段
- * (使用{ @link QueryStringQueryBuilder #字段(字符串)}),将运行提供的解析查询字段,并结合
- * 他们使用DisMax或者一个普通的布尔查询(参见{ @link QueryStringQueryBuilder # useDisMax(布尔)})。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder queryString() {
- return QueryBuilders.queryString("+kimchy -elasticsearch");
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * range query
- * 查询相匹配的文档在一个范围。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder rangeQuery() {
- return QueryBuilders
- .rangeQuery("name")
- .from("葫芦1000娃")
- .to("葫芦3000娃")
- .includeLower(true) //包括下界
- .includeUpper(false); //包括上界
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * span queries (first, near, not, or, term)
- * 跨度查询
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder spanQueries() {
- // Span First
- QueryBuilders.spanFirstQuery(
- QueryBuilders.spanTermQuery("name", "葫芦580娃"), // Query
- 30000 // Max查询范围的结束位置
- );
- // Span Near TODO NotSolved
- QueryBuilders.spanNearQuery()
- .clause(QueryBuilders.spanTermQuery("name", "葫芦580娃")) // Span Term Queries
- .clause(QueryBuilders.spanTermQuery("name", "葫芦3812娃"))
- .clause(QueryBuilders.spanTermQuery("name", "葫芦7139娃"))
- .slop(30000) // Slop factor
- .inOrder(false)
- .collectPayloads(false);
- // Span Not TODO NotSolved
- QueryBuilders.spanNotQuery()
- .include(QueryBuilders.spanTermQuery("name", "葫芦580娃"))
- .exclude(QueryBuilders.spanTermQuery("home", "山西省太原市2552街道"));
- // Span Or TODO NotSolved
- return QueryBuilders.spanOrQuery()
- .clause(QueryBuilders.spanTermQuery("name", "葫芦580娃"))
- .clause(QueryBuilders.spanTermQuery("name", "葫芦3812娃"))
- .clause(QueryBuilders.spanTermQuery("name", "葫芦7139娃"));
- // Span Term
- //return QueryBuilders.spanTermQuery("name", "葫芦580娃");
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * term query
- * 一个查询相匹配的文件包含一个术语。。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder termQuery() {
- return QueryBuilders.termQuery("name", "葫芦580娃");
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * terms query
- * 一个查询相匹配的多个value
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder termsQuery() {
- return QueryBuilders.termsQuery("name", // field
- "葫芦580娃", "葫芦3812娃") // values
- .minimumMatch(1); // 设置最小数量的匹配提供了条件。默认为1。
- }
- /**
- * TODO NotSolved
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * top children query
- * 构建了一种新的评分的子查询,与子类型和运行在子文档查询。这个查询的结果是,那些子父文档文件匹配。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder topChildrenQuery() {
- return QueryBuilders.topChildrenQuery(
- "blog_tag", // field
- QueryBuilders.termQuery("name", "葫芦3812娃") // Query
- )
- .score("max") // max, sum or avg
- .factor(5)
- .incrementalFactor(2);
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * wildcard query
- * 实现了通配符搜索查询。支持通配符* < /tt>,<tt>
- * 匹配任何字符序列(包括空),<tt> ? < /tt>,
- * 匹配任何单个的字符。注意该查询可以缓慢,因为它
- * 许多方面需要遍历。为了防止WildcardQueries极其缓慢。
- * 一个通配符词不应该从一个通配符* < /tt>或<tt>
- * < /tt> <tt> ?。
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder wildcardQuery() {
- return QueryBuilders.wildcardQuery("name", "葫芦*2娃");
- }
- /**
- * TODO NotSolved
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * nested query
- * 嵌套查询
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static QueryBuilder nestedQuery() {
- return QueryBuilders.nestedQuery("location", // Path
- QueryBuilders.boolQuery() // Your query
- .must(QueryBuilders.matchQuery("location.lat", 0.962590433140581))
- .must(QueryBuilders.rangeQuery("location.lon").lt(0.00000000000000000003))
- )
- .scoreMode("total"); // max, total, avg or none
- }
- /**
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * indices query
- * 索引查询
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- protected static IndicesQueryBuilder indicesQuery() {
- // Using another query when no match for the main one
- QueryBuilders.indicesQuery(
- QueryBuilders.termQuery("name", "葫芦3812娃"),
- Es_Utils.INDEX_DEMO_01, "index2"
- ) //设置查询索引上执行时使用不匹配指数
- .noMatchQuery(QueryBuilders.termQuery("age", "葫芦3812娃"));
- // Using all (match all) or none (match no documents)
- return QueryBuilders.indicesQuery(
- QueryBuilders.termQuery("name", "葫芦3812娃"),
- Es_Utils.INDEX_DEMO_01, "index2"
- ) // 设置不匹配查询,可以是 all 或者 none
- .noMatchQuery("none");
- }
- public static void main(String[] args) {
- Es_Utils.startupClient();
- try {
- searchTest(indicesQuery());
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- Es_Utils.shutDownClient();
- }
- }
- private static void searchTest(QueryBuilder queryBuilder) {
- //预准备执行搜索
- Es_Utils.client.prepareSearch(Es_Utils.INDEX_DEMO_01)
- .setTypes(Es_Utils.INDEX_DEMO_01_MAPPING)
- .setQuery(queryBuilder)
- .setFrom(0).setSize(20).setExplain(true)
- .execute()
- //注册监听事件
- .addListener(new ActionListener<SearchResponse>() {
- @Override
- public void onResponse(SearchResponse searchResponse) {
- Es_Utils.writeSearchResponse(searchResponse);
- }
- @Override
- public void onFailure(Throwable e) {
- }
- });
- }
- }
elasticsearch------java操作之QueryBuilders构建搜索Query的更多相关文章
- 【转载】Elasticsearch--java操作之QueryBuilders构建搜索Query
原文地址:https://www.cnblogs.com/pypua/articles/9459941.html package com.elasticsearch; import org.elast ...
- elasticsearch__5__java操作之FilterBuilders构建过滤器Query
FilterBuilders构建过滤器Query 代码如下: package com.elasticsearch; import org.elasticsearch.action.ActionList ...
- elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg
分析 Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计.它很像SQL中的GROUP BY但是功能更强大. 举个例子,让我们找到所有职员中最大 ...
- java操作elasticsearch实现query String
1.CommonTersQuery: 指定字段进行模糊查询 //commonTermsQuery @Test public void test35() throws UnknownHostExcept ...
- 使用Java操作Elasticsearch(Elasticsearch的java api使用)
1.Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询,格式是json. 索引index,相当于数据库中的 ...
- Elasticsearch java api 基本搜索部分详解
文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...
- Elasticsearch笔记五之java操作es
Java操作es集群步骤1:配置集群对象信息:2:创建客户端:3:查看集群信息 1:集群名称 默认集群名为elasticsearch,如果集群名称和指定的不一致则在使用节点资源时会报错. 2:嗅探功能 ...
- 2 - 基于ELK的ElasticSearch 7.8.x技术整理 - java操作篇 - 更新完毕
3.java操作ES篇 3.1.摸索java链接ES的流程 自行创建一个maven项目 3.1.1.依赖管理 点击查看代码 <properties> <ES-version>7 ...
- java操作elasticsearch实现组合桶聚合
1.terms分组查询 //分组聚合 @Test public void test40() throws UnknownHostException{ //1.指定es集群 cluster.name 是 ...
随机推荐
- rpm检验是否被改动过
参考原文http://vbird.dic.ksu.edu.tw/linux_basic/0520rpm_and_srpm.php#rpmmanager_verify rpm -qVa (当然可 ...
- Linux分区和挂载(mount命令的学习)
当Windows系统出现问题的时候,可能需要重装系统,这个时候我们往往会使用系统盘将系统重新安装在C盘上,其他盘上的文件都没有受到重装系统的影 响,这就是分区的好处之一.同样,在Linux中也需要分区 ...
- dm642的中断定时器
TIMER_Handle TimerHandle0; void timer1() { ////////////定时器/////////////////////// TimerHandle0 = TI ...
- MFC 多线程及线程同步
一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...
- freemarker处理哈希表的内建函数
freemarker处理哈希表的内建函数 1.简易说明 (1)map取值 (2)key取值 2.实现示例 <html> <head> <meta http-equiv=& ...
- Java中的表达式运算
1.问题背景 以下代码运行的结果为: A.a的值:8 b的值:7 B.a的值:8 b的值:8 C.a的值:9 b的值:7 D.a的值 ...
- dojo中获取表格中某一行的某个值
dojo中经常出现对表格中的某行进行操作,如单击某行修改.删除等.那怎样获取某行的唯一标示呢? 如查询表格中的某列有个userId,并且这个是唯一的,那么可以通过它来访问这一列 具体操作代码如下: v ...
- Python中ValueError: invalid literal for int() with base 10 的实用解决办法
爬虫代理IP由芝麻HTTP服务供应商提供今天在写爬虫程序的时候由于要翻页,做除法分页的时候出现了 totalCount = ' totalPage = int(totalCount)/20 Value ...
- 从Git到GitHub,详细教程
众所周知,一个稍微有点规模的项目,都不可能是一个人单打独斗完成的(能完成的大神别打我),所以,一个高效的项目团队就需要一个NB的工具来进行有效的交流(曾经有人问我企鹅不就可以吗,我竟无言以对),今天就 ...
- Supermarket POJ - 1456
A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold ...