问题:
通配符和fuzziness都只能搜索一个字,多个字就不起效【中文】
只能搜出来英文譬如java,dior,vue等英文
if(StrUtil.isNotEmpty(schoolName)){
searchSourceBuilder.query(QueryBuilders.boolQuery()
.must(QueryBuilders
.wildcardQuery("school","*"+schoolName+"*")));
}
searchSourceBuilder.query(QueryBuilders
.fuzzyQuery("major",majorName)
.fuzziness(Fuzziness.AUTO));
原因:
ES默认分词规则不能支持中文,通过安装IK Analysis for Elasticsearch支持中文分词。
解决方法:
第一步 下载Ik分词器插件
1、对应elasticsearch版本下载相应的IK版本
下载地址
https://github.com/medcl/elasticsearch-analysis-ik/releases
2.下载后解压到elasticsearch的plugins文件下【注意只留文件夹】
3. 重启elasticsearch
出现下图红框内字,即为成功
第二步配置elasticsearch
@Configuration
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http")));
return client;
}
}
第三步 配置实体类
/@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。
* 我们通过@Field注解来进行详细的指定,如果没有特殊需求,那么只需要添加@Document即可。
* @Field这里ik_max_word是按最细粒度分词,ik_smart是按最粗粒度分词。
*在搜索的时候用粗粒度,在写入的时候用细粒度。
*/
@Document(indexName = "article",type = "article")
public class Article implements Serializable {
@Field(type = FieldType.Text, searchAnalyzer = "ik_smart", analyzer = "ik_max_word")
private String title;
@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。
@Field这里ik_max_word是按最细粒度分词,ik_smart是按最粗粒度分词
第四步 实现精确搜索
term不会分词,keyword字段也不分词,安装了ik分词器,ik分词器是会默认分词的,
所以java中就不能再使用
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery(“title”,keyword);这种方法了
应该换成完全匹配的模式
MatchPhraseQueryBuilder matchPhraseQueryBuilder
= QueryBuilders.matchPhraseQuery(“title”, keyword);
//精准匹配
//TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword.toLowerCase());
MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("title", keyword);
sourceBuilder.query(matchPhraseQueryBuilder);
参考网址:
Elasticsearch中文高亮精确搜索问题,单字可以,多字不行等_text[] fragments = title.fragments()-CSDN博客
ElasticSearch中文搜索时只支持单个字符如何解决?(已解决)_java es搜索引擎支持一个字搜索-CSDN博客