elasticsearch 简介
不了解 elasticsearch 的人都以为 Es 只能进行模糊搜索,其实不仅能进行模糊搜索还能进行全匹配搜索。在集群模式 elasticsearch 的搜索把多个节点的数据汇集到一个节点最终显示给调用端,索引数据必须指定_index(database)及 index 下面的 type(table)。
查询 elasticsearch 全部数据
java 查询 elasticsearch 全部数据
1.确保启动 es 服务 2.打开浏览器访问http://127.0.0.1:9200/_plugin/head 查看我们上节课创建的 userInfo。
在com.syl.es下新建 QueryData1 类
image.png
编写搜索全部数据的函数
package com.syl.es;
import java.net.InetAddress;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder.Operator;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
public class QueryData1 {
/**
* @param args
*/
public static void main(String[] args) {
//调用搜索全部数据方法
searchAll();
}
/**
* 搜索全部数据
*/
public static void searchAll(){
//索引服务的地址
String elasticServer= "127.0.0.1";
//索引服务的端口
Integer elasticServerPort = 9300;
Client client=null;
try{
//初始化连接
Settings settings = Settings.settingsBuilder().build();
client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName(elasticServer), elasticServerPort));
//搜索全部数据
QueryBuilder bqb=QueryBuilders.matchAllQuery();
System.out.println(bqb.toString()+"====================");
SearchResponse response = client.prepareSearch("user").setTypes("userInfo") //set index set type
.setQuery(bqb.toString())
.execute()
.actionGet();
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits() +" "+ hits.getHits().length);
for (int i = 0; i < hits.getHits().length; i++) {
System.out.println("===searchAll()====="+hits.getAt(i).getId()+"-------"
+ "------"+hits.getAt(i).getSource());
}
//关闭连接
client.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
QueryBuilders.matchAllQuery() 代表查询全部数据。
client.prepareSearch("user").setTypes("userInfo")代表查询 user 索引的 userInfo
type(一个 index 索引下可以有多个 type,所以要指定某个 type)。
setQuery(bqb.toString()) 代表设置查询的条件
以 Java Application 的方式,运行QueryData1.java文件。
查看执行结果
查询 elasticsearch 部分数据
编写 searchSize 方法
在QueryData1.java,添加函数 searchSize
/**
* 搜索指定数量数据
*/
public static void searchSize(){
//索引服务的地址
String elasticServer= "127.0.0.1";
//索引服务的端口
Integer elasticServerPort = 9300;
Client client=null;
try{
//初始化连接
Settings settings = Settings.settingsBuilder().build();
client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName(elasticServer), elasticServerPort));
//搜索数据
QueryBuilder bqb=QueryBuilders.matchAllQuery();
SearchResponse response = client.prepareSearch("user").setTypes("userInfo")
.setQuery(bqb.toString())
.setFrom(0).setSize(2)//设置条数
.execute()
.actionGet();
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits() +" "+ hits.getHits().length);
//打印搜索结果
for (int i = 0; i < hits.getHits().length; i++) {
System.out.println("====searchSize()==="+hits.getAt(i).getId()+"------"
+ "-------"+hits.getAt(i).getSource());
}
//关闭连接
client.close();
}catch (Exception e) {
e.printStackTrace();
}
}
setFrom(0).setSize(2) 代表从开始查询返回 2 条数据。
修改主函数,调用删除索引函数
注释掉 searchAll() 的调用,增加调用 searchSize()。
public static void main(String[] args) {
//searchAll();
searchSize();
}
运行代码
以 Java Application 的方式,运行QueryData1.java文件。
查看运行结果
模糊搜索 elasticsearch 数据
编写 searchMatchQuery 方法
在QueryData1.java,添加函数 searchMatchQuery
/**
* 模糊搜索索引数据
*/
public static void searchMatchQuery(){
//索引服务的地址
String elasticServer= "127.0.0.1";
//索引服务的端口
Integer elasticServerPort = 9300;
Client client=null;
try{
//初始化连接
Settings settings = Settings.settingsBuilder().build();
client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName(elasticServer), elasticServerPort));
//设置查询条件
BoolQueryBuilder bqb=QueryBuilders.boolQuery();
float BOOST = (float) 1.2;
MatchQueryBuilder titleSearchBuilder = QueryBuilders.matchQuery("name", "张中国");
titleSearchBuilder.boost(BOOST);
titleSearchBuilder.operator(Operator.AND);
bqb.must(titleSearchBuilder);
//模糊搜索数据
SearchResponse response = client.prepareSearch("user").setTypes("userInfo")
.setQuery(bqb.toString())
.setFrom(0).setSize(60).setExplain(true) //setExplain 按查询匹配度排序
.execute()
.actionGet();
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits() +" "+ hits.getHits().length);
//打印搜索结果
for (int i = 0; i < hits.getHits().length; i++) {
System.out.println("===searchMatchQuery()==="+hits.getAt(i).getId()+"--" +
"-----------"+hits.getAt(i).getSource());
}
//关闭连接
client.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
修改主函数,调用删除索引函数
注释掉 searchSize()的调用,增加调用 searchMatchQuery。
public static void main(String[] args) {
//搜索全部数据
//searchAll();
//搜索指定数量数据
//searchSize();
//模糊搜索
searchMatchQuery();
}
运行代码
以 Java Application 的方式,运行QueryData1.java文件。
查看运行结果
运行发现 3 条数据都查询出来了。
拓展:大家可以把搜索关键词换成中国试试能否搜索出来,在换成中看能否搜索出来。
网友评论