1.创建index并初制定分词
由于官方提供的XContentBuilder工具没有直接写json来的直接,这里我就直接把setting用json创建
/**
* 创建索引
* @param indexName 索引名
*/
public static void createIndex(String indexName){
try {
EsTools esTools = new EsTools();
TransportClient client = esTools.getClient();
/**1.创建索引映射*/
client.admin().indices()
.prepareCreate(indexName).setSettings("{\"index\" : "
+ "{\"analysis\" : "
+ "{\"analyzer\" : "
+ "{\"ik_pinyin_analyzer\" : "
+ "{\"tokenizer\" : \"ik_max_word\", "
+ "\"filter\" : [\"my_pinyin\",\"word_delimiter\"]}},"
+ "\"filter\" : {\"my_pinyin\" : "
+ "{\"type\" : \"pinyin\", \"first_letter\" : \"prefix\",\"padding_char\" : \" \" }}}}}").get();
System.out.println("索引创建成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("索引创建失败");
}
}
2.创建type并设置mapping
/**
* 创建类型并设置mapping
* @param indexName 索引名
* @param typeName 类型名
*/
public static void createMapping(String indexName,String typeName,String columnName){
EsTools esTools = new EsTools();
TransportClient client = esTools.getClient();
//创建mapping
PutMappingRequest mapping = Requests.putMappingRequest(indexName).type(typeName)
.source("{\""+ typeName +"\": {\"properties\": "
+ "{\"name\": {\"type\": \"string\",\"analyzer\": \"ik_pinyin_analyzer\"}}}}");
client.admin().indices().putMapping(mapping).actionGet();
System.out.println("mapping创建成功");
}
这里需要提到的是:first_letter即拼音首字母,可以设置为(默认为none): prefix , append , only 和none,如“中国”的分词效果分别为”zg zhong guo","zhong guo zg","zg","zhong guo"
3.插入数据
/**
* 插入数据
* @param indexName 索引名
* @param typeName 类型
* @param column 列
* @param value 值
*/
public static void setDate(String indexName,String typeName,String column,String value){
try {
EsTools esTools = new EsTools();
TransportClient client = esTools.getClient();
/**2.插入数据*/
IndexResponse response = client.prepareIndex(indexName,typeName)
.setSource(jsonBuilder()
.startObject().field(column, value).endObject()
)
.setId(UUID.randomUUID().toString()+"")
.get();
System.out.println("插入成功");
} catch (IOException e) {
e.printStackTrace();
System.out.println("插入失败");
}
}
4.查询并高亮显示
/**
* 查询打印
* @param index 索引
* @param type 类型
* @param column 列
* @param key 关键词
* @throws UnknownHostException
*/
public static void findPrint(String index,String type,String column,String key) throws UnknownHostException{
// 设置集群名称
Settings settings = Settings.builder()
.put("cluster.name", "my-application").build();
// 创建client
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("127.0.0.1"), 9300));
QueryBuilder matchQuery = QueryBuilders.matchQuery(column, key);
HighlightBuilder hiBuilder=new HighlightBuilder();
hiBuilder.preTags("<h2>");
hiBuilder.postTags("</h2>");
hiBuilder.field(column);
// 搜索数据
SearchResponse response = client.prepareSearch(index)
.setTypes(type)
.setQuery(matchQuery)
.highlighter(hiBuilder)
.execute().actionGet();
//获取查询结果集
SearchHits searchHits = response.getHits();
System.out.println("共搜到:"+searchHits.getTotalHits()+"条结果!");
//遍历结果
for(SearchHit hit:searchHits){
System.out.println("String方式打印文档搜索内容:");
System.out.println(hit.getSourceAsString());
if(null != hit && null != hit.getHighlightFields() && hit.getHighlightFields().size() > 0 ){
System.out.println("Map方式打印高亮内容");
System.out.println(hit.getHighlightFields());
System.out.println("遍历高亮集合,打印高亮片段:");
Text[] text = hit.getHighlightFields().get(column).getFragments();
for (Text str : text) {
System.out.println(str.string());
}
}
}
}
调用
public static void main(String[] args) throws IOException{
String indexName = "index3";
String typeName = "t3";
String columnName = "name";
// //创建索引
createIndex(indexName);
//
// //创建类型并设置mapping
createMapping(indexName,typeName,columnName);
//
// //插入数据
setDate(indexName,typeName,columnName,"曹操官渡大破袁绍,为吞并河北打开了胜利的大门");
//查询数据
findPrint(indexName,typeName,columnName,"w");
}