/**
* 系统环境: vm12 下的centos 7.2
* 当前安装版本: elasticsearch-2.4.0.tar.gz
*/
QueryBuilder 是es中提供的一个查询接口, 可以对其进行参数设置来进行查用擦还训
package com.wenbronk.javaes; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Iterator; import java.util.Map.Entry; import org.elasticsearch.action.ListenableActionFuture; import org.elasticsearch.action.get.GetRequestBuilder; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.text.Text; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.IndicesQueryBuilder; import org.elasticsearch.index.query.NestedQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryStringQueryBuilder; import org.elasticsearch.index.query.RangeQueryBuilder; import org.elasticsearch.index.query.SpanFirstQueryBuilder; import org.elasticsearch.index.query.WildcardQueryBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.junit.Before; import org.junit.Test; /** * java操作查询api * @author 231 * */ public class JavaESQuery { private TransportClient client; @Before public void testBefore() { Settings settings = Settings.settingsBuilder().put("cluster.name", "wenbronk_escluster").build(); client = TransportClient.builder().settings(settings).build() .addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("192.168.50.37", 9300))); System.out.println("success to connect escluster"); } /** * 使用get查询 */ @Test public void testGet() { GetRequestBuilder requestBuilder = client.prepareGet("twitter", "tweet", "1"); GetResponse response = requestBuilder.execute().actionGet(); GetResponse getResponse = requestBuilder.get(); ListenableActionFuture<GetResponse> execute = requestBuilder.execute(); System.out.println(response.getSourceAsString()); } /** * 使用QueryBuilder * termQuery("key", obj) 完全匹配 * termsQuery("key", obj1, obj2..) 一次匹配多个值 * matchQuery("key", Obj) 单个匹配, field不支持通配符, 前缀具高级特性 * multiMatchQuery("text", "field1", "field2"..); 匹配多个字段, field有通配符忒行 * matchAllQuery(); 匹配所有文件 */ @Test public void testQueryBuilder() { // QueryBuilder queryBuilder = QueryBuilders.termQuery("user", "kimchy"); QueryBUilder queryBuilder = QueryBuilders.termQuery("user", "kimchy", "wenbronk", "vini"); QueryBuilders.termsQuery("user", new ArrayList<String>().add("kimchy")); // QueryBuilder queryBuilder = QueryBuilders.matchQuery("user", "kimchy"); // QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("kimchy", "user", "message", "gender"); QueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); searchFunction(queryBuilder); } /** * 组合查询 * must(QueryBuilders) : AND * mustNot(QueryBuilders): NOT * should: : OR */ @Test public void testQueryBuilder2() { QueryBuilder queryBuilder = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery("user", "kimchy")) .mustNot(QueryBuilders.termQuery("message", "nihao")) .should(QueryBuilders.termQuery("gender", "male")); searchFunction(queryBuilder); } /** * 只查询一个id的 * QueryBuilders.idsQuery(String...type).ids(Collection<String> ids) */ @Test public void testIdsQuery() { QueryBuilder queryBuilder = QueryBuilders.idsQuery().ids("1"); searchFunction(queryBuilder); } /** * 包裹查询, 高于设定分数, 不计算相关性 */ @Test public void testConstantScoreQuery() { QueryBuilder queryBuilder = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("name", "kimchy")).boost(2.0f); searchFunction(queryBuilder); // 过滤查询 // QueryBuilders.constantScoreQuery(FilterBuilders.termQuery("name", "kimchy")).boost(2.0f); } /** * disMax查询 * 对子查询的结果做union, score沿用子查询score的最大值, * 广泛用于muti-field查询 */ @Test public void testDisMaxQuery() { QueryBuilder queryBuilder = QueryBuilders.disMaxQuery() .add(QueryBuilders.termQuery("user", "kimch")) // 查询条件 .add(QueryBuilders.termQuery("message", "hello")) .boost(1.3f) .tieBreaker(0.7f); searchFunction(queryBuilder); } /** * 模糊查询 * 不能用通配符, 不知道干啥用 */ @Test public void testFuzzyQuery() { QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("user", "kimch"); searchFunction(queryBuilder); } /** * 父或子的文档查询 */ @Test public void testChildQuery() { QueryBuilder queryBuilder = QueryBuilders.hasChildQuery("sonDoc", QueryBuilders.termQuery("name", "vini")); searchFunction(queryBuilder); } /** * moreLikeThisQuery: 实现基于内容推荐, 支持实现一句话相似文章查询 * { "more_like_this" : { "fields" : ["title", "content"], // 要匹配的字段, 不填默认_all "like_text" : "text like this one", // 匹配的文本 } } percent_terms_to_match:匹配项(term)的百分比,默认是0.3 min_term_freq:一篇文档中一个词语至少出现次数,小于这个值的词将被忽略,默认是2 max_query_terms:一条查询语句中允许最多查询词语的个数,默认是25 stop_words:设置停止词,匹配时会忽略停止词 min_doc_freq:一个词语最少在多少篇文档中出现,小于这个值的词会将被忽略,默认是无限制 max_doc_freq:一个词语最多在多少篇文档中出现,大于这个值的词会将被忽略,默认是无限制 min_word_len:最小的词语长度,默认是0 max_word_len:最多的词语长度,默认无限制 boost_terms:设置词语权重,默认是1 boost:设置查询权重,默认是1 analyzer:设置使用的分词器,默认是使用该字段指定的分词器 */ @Test public void testMoreLikeThisQuery() { QueryBuilder queryBuilder = QueryBuilders.moreLikeThisQuery("user") .like("kimchy"); // .minTermFreq(1) //最少出现的次数 // .maxQueryTerms(12); // 最多允许查询的词语 searchFunction(queryBuilder); } /** * 前缀查询 */ @Test public void testPrefixQuery() { QueryBuilder queryBuilder = QueryBuilders.matchQuery("user", "kimchy"); searchFunction(queryBuilder); } /** * 查询解析查询字符串 */ @Test public void testQueryString() { QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("+kimchy"); searchFunction(queryBuilder); } /** * 范围内查询 */ public void testRangeQuery() { QueryBuilder queryBuilder = QueryBuilders.rangeQuery("user") .from("kimchy") .to("wenbronk") .includeLower(true) // 包含上界 .includeUpper(true); // 包含下届 searchFunction(queryBuilder); } /** * 跨度查询 */ @Test public void testSpanQueries() { QueryBuilder queryBuilder1 = QueryBuilders.spanFirstQuery(QueryBuilders.spanTermQuery("name", "葫芦580娃"), 30000); // Max查询范围的结束位置 QueryBuilder queryBuilder2 = 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 QueryBuilder queryBuilder3 = QueryBuilders.spanNotQuery() .include(QueryBuilders.spanTermQuery("name", "葫芦580娃")) .exclude(QueryBuilders.spanTermQuery("home", "山西省太原市2552街道")); // Span Or QueryBuilder queryBuilder4 = QueryBuilders.spanOrQuery() .clause(QueryBuilders.spanTermQuery("name", "葫芦580娃")) .clause(QueryBuilders.spanTermQuery("name", "葫芦3812娃")) .clause(QueryBuilders.spanTermQuery("name", "葫芦7139娃")); // Span Term QueryBuilder queryBuilder5 = QueryBuilders.spanTermQuery("name", "葫芦580娃"); } /** * 测试子查询 */ @Test public void testTopChildrenQuery() { QueryBuilders.hasChildQuery("tweet", QueryBuilders.termQuery("user", "kimchy")) .scoreMode("max"); } /** * 通配符查询, 支持 * * 匹配任何字符序列, 包括空 * 避免* 开始, 会检索大量内容造成效率缓慢 */ @Test public void testWildCardQuery() { QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("user", "ki*hy"); searchFunction(queryBuilder); } /** * 嵌套查询, 内嵌文档查询 */ @Test public void testNestedQuery() { QueryBuilder queryBuilder = QueryBuilders.nestedQuery("location", QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("location.lat", 0.962590433140581)) .must(QueryBuilders.rangeQuery("location.lon").lt(36.0000).gt(0.000))) .scoreMode("total"); } /** * 测试索引查询 */ @Test public void testIndicesQueryBuilder () { QueryBuilder queryBuilder = QueryBuilders.indicesQuery( QueryBuilders.termQuery("user", "kimchy"), "index1", "index2") .noMatchQuery(QueryBuilders.termQuery("user", "kimchy")); } /** * 查询遍历抽取 * @param queryBuilder */ private void searchFunction(QueryBuilder queryBuilder) { SearchResponse response = client.prepareSearch("twitter") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setScroll(new TimeValue(60000)) .setQuery(queryBuilder) .setSize(100).execute().actionGet(); while(true) { response = client.prepareSearchScroll(response.getScrollId()) .setScroll(new TimeValue(60000)).execute().actionGet(); for (SearchHit hit : response.getHits()) { Iterator<Entry<String, Object>> iterator = hit.getSource().entrySet().iterator(); while(iterator.hasNext()) { Entry<String, Object> next = iterator.next(); System.out.println(next.getKey() + ": " + next.getValue()); if(response.getHits().hits().length == 0) { break; } } } break; } // testResponse(response); } /** * 对response结果的分析 * @param response */ public void testResponse(SearchResponse response) { // 命中的记录数 long totalHits = response.getHits().totalHits(); for (SearchHit searchHit : response.getHits()) { // 打分 float score = searchHit.getScore(); // 文章id int id = Integer.parseInt(searchHit.getSource().get("id").toString()); // title String title = searchHit.getSource().get("title").toString(); // 内容 String content = searchHit.getSource().get("content").toString(); // 文章更新时间 long updatetime = Long.parseLong(searchHit.getSource().get("updatetime").toString()); } } /** * 对结果设置高亮显示 */ public void testHighLighted() { /* 5.0 版本后的高亮设置 * client.#().#().highlighter(hBuilder).execute().actionGet(); HighlightBuilder hBuilder = new HighlightBuilder(); hBuilder.preTags("<h2>"); hBuilder.postTags("</h2>"); hBuilder.field("user"); // 设置高亮显示的字段 */ // 加入查询中 SearchResponse response = client.prepareSearch("blog") .setQuery(QueryBuilders.matchAllQuery()) .addHighlightedField("user") // 添加高亮的字段 .setHighlighterPreTags("<h1>") .setHighlighterPostTags("</h1>") .execute().actionGet(); // 遍历结果, 获取高亮片段 SearchHits searchHits = response.getHits(); for(SearchHit hit:searchHits){ System.out.println("String方式打印文档搜索内容:"); System.out.println(hit.getSourceAsString()); System.out.println("Map方式打印高亮内容"); System.out.println(hit.getHighlightFields()); System.out.println("遍历高亮集合,打印高亮片段:"); Text[] text = hit.getHighlightFields().get("title").getFragments(); for (Text str : text) { System.out.println(str.string()); } } } }
相关推荐
Spring Data 提供的注解使得操作 Elasticsearch 如同操作数据库一样简单,提高了开发效率。 **搜索引擎的构建:** 构建基于 Elasticsearch 的搜索引擎涉及以下步骤: 1. **安装与配置**:部署 Elasticsearch 集群...
Elasticsearch基于Lucene构建,它将Lucene的搜索功能封装成易于使用的RESTful API。这使得开发者可以轻松地在应用程序中集成强大的搜索功能,而无需深入理解复杂的搜索引擎底层技术。Elasticsearch具有分布式、实时...
Elasticsearch 7.17.3 是一个高度可扩展的开源全文搜索引擎,以其强大的分布式、实时搜索和分析能力而闻名。它基于Lucene构建,但提供了更高级别的API和服务,使得管理和操作大规模数据变得更加简单。这个版本的...
Elasticsearch是一个强大的开源搜索引擎,广泛应用于数据存储和分析领域。为了增强其对文本的处理能力,特别是中文分词和语义理解,开发者通常会利用各种插件来扩展其功能。"elasticsearch-analysis-dynamic-synonym...
Elasticsearch 分析插件 IK 分词器是用于优化 Elasticsearch 搜索引擎中文处理的重要工具。在中文环境下,正确的分词对于提升搜索质量和精确性至关重要。IK 分词器因其高效的性能和丰富的自定义功能,在 Elastic...
《Elasticsearch Analysis IK插件7.10.2版详解》 Elasticsearch Analysis IK插件是针对Elasticsearch的中文分词器,它的全称为"elasticsearch-analysis-ik",在7.10.2版本中,该插件为用户提供了更强大的中文处理...
5. RESTful API:Elasticsearch 使用 RESTful 风格的 API 进行操作,使得与各种编程语言的集成变得简单,通过 HTTP 协议即可进行数据的增删改查和搜索操作。 6. 插件支持:Elasticsearch 社区提供了丰富的插件,...
7. **Java REST客户端的使用**:`RestHighLevelClient`是Elasticsearch提供的高级Java客户端,提供了丰富的API用于操作索引、文档、搜索等。创建客户端实例需要提供ES服务器的URL,可以设置连接参数如超时、重试策略...
Elasticsearch是一个强大的开源搜索引擎,基于Java开发,其核心功能是全文检索,但同时也提供了数据分析、实时聚合以及数据存储的能力。这个"elasticsearch-7.17.7-windows-x86-64.zip"文件是Elasticsearch的7.17.7...
(狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战),包含了小狂神讲的东西,特别适合新手学习,笔记保存下来可以多看看。好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个...
- **RESTful API**:Elasticsearch基于HTTP和JSON,提供了一套简单易用的RESTful接口,方便开发者进行索引、搜索、聚合等操作。 - **实时性**:Elasticsearch在数据被索引时就可搜索,无需额外的刷新操作,这使得...
开发者可以用任何支持HTTP的编程语言来操作Elasticsearch,如Python、Java、JavaScript等。 4. **数据结构丰富**:除了支持文本搜索,Elasticsearch还支持数值、地理位置、日期等不同数据类型的索引,方便处理复杂...
在Windows平台上,Elasticsearch的8.2.0版本是为64位操作系统设计的,提供了强大的搜索和数据分析功能。这个压缩包“elasticsearch-8.2.0-windows-x86_64.zip”包含了在Windows系统上运行Elasticsearch所需的所有...
2. RESTful API:Elasticsearch采用RESTful风格的HTTP接口,使用户可以通过简单的HTTP请求进行索引、搜索、更新和删除操作,极大地简化了与搜索引擎的交互。 3. 全文搜索:Elasticsearch支持丰富的全文检索功能,...
Elasticsearch 7.5.2 是一个高度可扩展的开源全文搜索引擎,广泛应用于数据分析、日志聚合和实时搜索场景。这个版本的压缩包“elasticsearch-7.5.2-linux-x86_64.tar.gz”是为Linux 64位系统优化的,包含了在该操作...
Elasticsearch(ES)是一种流行的开源全文搜索引擎,它基于Lucene构建,提供了分布式、近实时的搜索和分析功能。在中文环境下,为了更好地处理和理解中文文本,我们需要使用特定的分析器。"elasticsearch-analysis-...
- `bin`目录:包含可执行文件,如`elasticsearch.bat`启动脚本,以及用于管理和操作Elasticsearch的命令行工具。 - `config`目录:存储配置文件,如`elasticsearch.yml`,在这里你可以设置Elasticsearch的各项参数。...
14. **启动与管理**:通过`bin/elasticsearch`脚本启动服务,使用`bin/elasticsearch-cli`进行管理操作,如查看状态、停止服务等。 15. **数据导入与搜索**:可以使用`curl`命令或者客户端库(如Python的`elastic...
Java操作Elasticsearch 5.x的Demo详解 在大数据时代,Elasticsearch作为一个高效、可扩展的全文搜索引擎,被广泛应用于日志分析、实时...希望这个简单的Java操作Elasticsearch 5.x的Demo能帮助你开始这段探索之旅。
通过elasticsearch-head可以直观地查看Elasticsearch节点的状态、索引信息,以及进行简单的数据操作,如搜索、监控集群健康状况等。 为了保证ELK堆栈的稳定运行,还需要考虑监控和维护方面,例如定期检查硬件资源...