您的位置:首页 > 产品设计 > UI/UE

elasticsearch__4__java操作之QueryBuilders构建搜索Query

2017-06-07 14:54 609 查看
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



@NotSolved未解决

[java] view
plain copy

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 分布式搜索系列专栏: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



@NotSolved未解决

[java] view
plain copy

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

}

});

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐