Elasticsearch 分词
分词分为读时分词和写时分词。
读时分词发生在用户查询时,ES 会即时地对用户输入的关键词进行分词,分词结果只存在内存中,当查询结束时,分词结果也会随即消失。而写时分词发生在文档写入时,ES 会对文档进行分词后,将结果存入倒排索引,该部分最终会以文件的形式存储于磁盘上,不会因查询结束或者 ES 重启而丢失。
写时分词器需要在 mapping 中指定,而且一经指定就不能再修改,若要修改必须新建索引。
分词一般在ES中有分词器处理。英文为Analyzer,它决定了分词的规则,Es默认自带了很多分词器,如:
Standard、english、Keyword、Whitespace等等。默认的分词器为Standard,通过它们各自的功能可组合
成你想要的分词规则。分词器具体详情可查看官网:分词器
另外,在常用的中文分词器、拼音分词器、繁简体转换插件。国内用的就多的分别是:
elasticsearch-analysis-ik
elasticsearch-analysis-pinyin
elasticsearch-analysis-stconvert
可在以上链接找到自己对于的elasticsearch版本安装插件。
这里提供一个我自己封装的elasticsearch 5.5.0 的Docker镜像,里面在官方镜像的基础上加入了以上三个个插件,链接:
liaodashuai/elasticsearch:1.0.2
简单了解至此,下面用SpringBoot 集成
实现效果:
打造匹配搜索和高亮搜索API
使用中文、拼音和繁简体都能搜索到
扩展另外众多的搜索方式,简单使用测试用例实现
集成SpringBoot 实现高亮显示、拼音搜索
导入jar包,springboot 2.0.4只支持5.X版本的Es,注意版本对应,避免坑。
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-elasticsearch', version: '2.0.6.RELEASE'
compile 'org.elasticsearch.client:x-pack-transport:5.5.0'
配置连接Es
@Configuration
public class EsConfiguration {
private Client esClient;
/**
* Transport client transport client.
* 如果配置X-PACK ,则需要在此处配置用户信息
*
* @return the transport client
*/
@Bean
public Client transportClient() {
TransportClient client = null;
try {
client = new PreBuiltXPackTransportClient(Settings.builder()
//嗅探集群状态
// .put("client.transport.sniff", true)
.put("cluster.name", "docker-cluster")
//如果有配置xpack插件,需要配置登录
.put("xpack.security.user", "elastic:changeme")
.build())
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("120.79.58.138"), 9300));
} catch (UnknownHostException e) {
log.error("elasticsearch 连接失败 !");
}
return client;
}
/**
* 避免TransportClient每次使用创建和释放
*/
public Client esTemplate() {
if (StringUtils.isEmpty(esClient) || StringUtils.isEmpty(esClient.admin())) {
esClient = transportClient();
return esClient;
}
return esClient;
}
}
配置实体Mapping
@Document(indexName = "film-entity", type = "film")
@Setting(settingPath = "/json/film-setting.json")
@Mapping(mappingPath = "/json/film-mapping.json")
public class FilmEntity {
@Id
private Long id;
// @Field(type = FieldType.Text, searchAnalyzer = "ik_max_word", analyzer = "ik_smart"