Elasticsearch7.30 使用过程中的问题整理
我在使用Elasticsearch7.30 结合ik分词器时 不生效 遇到的坑
在使用es分词器的时候,配置了ik分词器,不过在后来的实际应用中发现ik分词器并没有真正生效,后来查了一些资料,是要在创建创建索引的时候,就要指定好这个索引的默认分词方式 比如’ik_max_word’,然后再进行数据的导入,最后查询的时候,指定分词方式’ik_max_word’;
上代码
我这里用的是jestclient连接es
@Autowired
private JestClient jestClient;
public Result selectAllDataForEs() {
// 1.先删除es库的原始数据
JestResult jr = null;
boolean bool = false;
try {
jr = jestClient.execute(new DeleteIndex.Builder("national_tax_law_library").build());
bool = jr.isSucceeded();
} catch (Exception e) {
e.printStackTrace();
}
// 设置默认分词方式为ik_max_word
String settings = "{\n" +
" \"index\" : {\n" +
" \"analysis.analyzer.default.type\": \"ik_max_word\"\n" +
" }\n" +
" }";
// 先创建索引并设置默认分词方式
CreateIndex createIndex = new CreateIndex.Builder("national_tax_law_library").settings(settings).build();
try {
jestClient.execute(createIndex);
} catch (IOException e) {
e.printStackTrace();
LogUtils.error(e.getMessage());
}
// 这里从数据库拿出要插入es中的数据
List<ESearchNationalTaxLawLibrary> eSearchNationalTaxLawLibraries = nationalTaxLawLibraryService.selectAllDataForEs(null);
Bulk.Builder bulkNew = new Bulk.Builder().defaultIndex("national_tax_law_library").defaultType("national_tax_law_library_type");
for (ESearchNationalTaxLawLibrary item : eSearchNationalTaxLawLibraries) {
// 构建数据
Index index = new Index.Builder(item).build();
bulkNew.addAction(index);
}
try {
// 批量导入数据到es
JestResult jestResult = jestClient.execute(bulkNew.build());
LogUtils.debug("ES 插入完成");
} catch (IOException e) {
e.printStackTrace();
LogUtils.error(e.getMessage());
}
return ResultGenerator.genSuccessResult();
}
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 构建查询参数事指定分词方式为'ik_max_word'
boolQueryBuilder.should(QueryBuilders.matchPhraseQuery("title", param.getKeyWord()).boost(2.0f).analyzer("ik_max_word"));
boolQueryBuilder.should(QueryBuilders.matchPhraseQuery("clauseText", param.getKeyWord()).boost(1.0f).analyzer("ik_max_word"));
需要注意的地方:
- 总结: 在创建索引库的时候,就要创建好这个库的分词方式,然后再导入数据, 最后搜索的时候,指定一下分词方式;先导入数据,再配置分词方式,不会生效的
- 如果有不正确的地方还请各位大佬指正,