针对词条查询(TermQuery),查看默认中文分词器的效果:
[itstar@hadoop105 elasticsearch]$ curl -XGET 'http://hadoop105:9200/_analyze?
pretty&analyzer=standard' -d '中华人民共和国'
{
"tokens" : [
{
"token" : "中",
"start_offset" : 0,
"end_offset" : 1,
"type" : "
"position" : 0
},
{
"token" : "华",
"start_offset" : 1,
"end_offset" : 2,
"type" : "
"position" : 1
},
{
"token" : "人",
"start_offset" : 2,
"end_offset" : 3,
"type" : "
"position" : 2
},
{
"token" : "民",
"start_offset" : 3,
"end_offset" : 4,
"type" : "
"position" : 3
},
{
"token" : "共",
"start_offset" : 4,
"end_offset" : 5,
"type" : "
"position" : 4
},
{
"token" : "和",
"start_offset" : 5,
"end_offset" : 6,
"type" : "
"position" : 5
},
{
"token" : "国",
"start_offset" : 6,
"end_offset" : 7,
"type" : "
"position" : 6
}
]
}
4.1 IK分词器的安装
4.1.1 前期准备工作
1)CentOS联网
配置CentOS能连接外网。Linux虚拟机ping www.baidu.com 是畅通的
2)jar包准备
(1)elasticsearch-analysis-ik-master.zip
(下载地址:https://github.com/medcl/elasticsearch-analysis-ik)
(2)apache-maven-3.0.5-bin.tar.gz
4.1.2 jar包安装
~~1)Maven解压、配置MAVEN_HOME和PATH。~~
[itstar@hadoop102 software]# tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/
[itstar@hadoop102 apache-maven-3.0.5]# sudo vi /etc/profifile
#MAVEN_HOME export MAVEN_HOME=/opt/module/apache-maven-3.0.5 export
PATH=$PATH:$MAVEN_HOME/bin
[itstar@hadoop101 software]#source /etc/profifile
验证命令:mvn -version
2)Ik分词器解压、打包与配置
ik分词器解压
[itstar@hadoop102 software]$ unzip elasticsearch-analysis-ik-master.zip -d ./
进入ik分词器所在目录
[itstar@hadoop102 software]$ cd elasticsearch-analysis-ik-master
使用maven进行打包
[itstar@hadoop102 elasticsearch-analysis-ik-master]$ mvn package -Pdist,native -DskipTests -
Dtar
打包完成之后,会出现 target/releases/elasticsearch-analysis-ik-{version}.zip
[itstar@hadoop102 releases]$ pwd /opt/software/elasticsearch-analysis-ik�
master/target/releases
对zip文件进行解压,并将解压完成之后的文件拷贝到es所在目录下的/plugins/
[itstar@hadoop102 releases]$ unzip elasticsearch-analysis-ik-6.0.0.zip
[itstar@hadoop102 releases]$ cp -r elasticsearch /opt/module/elasticsearch-5.6.1/plugins/
需要修改plugin-descriptor.properties文件,将其中的es版本号改为你所使用的版本号,即完成ik分词
器的安装
[itstar@hadoop102 elasticsearch]$ vi plugin-descriptor.properties
71行 elasticsearch.version=6.0.0 修改为 elasticsearch.version=5.6.1
至此,安装完成,重启ES!
注意:需选择与es相同版本的ik分词器。
安装方法(2种):
1.
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.1.1/elasticsearch-analysis-ik-6.1.1.zip
2.
cp elasticsearch-analysis-ik-6.1.1.zip ./elasticsearch-6.1.1/plugins/
unzip elasticsearch-analysis-ik-6.1.1.zip -d ik-analyzer
3.
elasticsearch-plugin install -f file:///usr/local/elasticsearch-analysis-ik- 6.1.1.zip
4.2 IK分词器的使用
4.2.1 命令行查看结果
ik_smart模式
[itstar@hadoop102 elasticsearch]$ curl -XGET 'http://hadoop104:9200/_analyze?
pretty&analyzer=ik_smart' -d '中华人民共和国'
curl -H "Content-Type:application/json" -XGET
'http://192.168.109.133:9200/_analyze?pretty' -d
'{"analyzer":"ik_smart","text":"中华人民共和国"}'
{
"tokens" : [
{
"token" : "中华人民共和国",
"start_offset" : 0,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 0
}
]
}
ik_max_word模式
[itstar@hadoop102 elasticsearch]$ curl -XGET 'http://hadoop104:9200/_analyze?
pretty&analyzer=ik_max_word' -d '中华人民共和国'
curl -H "Content-Type:application/json" -XGET
'http://192.168.109.133:9200/_analyze?pretty' -d
'{"analyzer":"ik_max_word","text":"中华人民共和国"}'
{
"tokens" : [
{
"token" : "中华人民共和国",
"start_offset" : 0,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "中华人民",
"start_offset" : 0,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "中华",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "华人",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "人民共和国",
"start_offset" : 2,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 4
},
{
"token" : "人民",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 5
},
{
"token" : "共和国",
"start_offset" : 4,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 6
},
{
"token" : "共和",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 7
},
{
"token" : "国",
"start_offset" : 6,
"end_offset" : 7,
"type" : "CN_CHAR",
"position" : 8
}
]
}
4.2.2 JavaAPI操作
1)创建索引
//创建索引(数据库)
@Test
public void createIndex() {
//创建索引
client.admin().indices().prepareCreate("blog4").get();
//关闭资源
client.close();
}
2)创建mapping
//创建使用ik分词器的mapping
@Test
public void createMapping() throws Exception {
// 1设置mapping
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.startObject("article")
.startObject("properties")
.startObject("id1")
.field("type", "string")
.field("store", "yes")
.field("analyzer","ik_smart")
.endObject()
.startObject("title2")
.field("type", "string")
.field("store", "no")
.field("analyzer","ik_smart")
.endObject()
.startObject("content")
.field("type", "string")
.field("store", "yes")
.field("analyzer","ik_smart")
.endObject()
.endObject()
.endObject()
.endObject();
// 2 添加mapping
PutMappingRequest mapping =
Requests.putMappingRequest("blog4").type("article").source(builder);
client.admin().indices().putMapping(mapping).get();
// 3 关闭资源
client.close();
}
3)插入数据
//创建文档,以map形式
@Test
public void createDocumentByMap() {
HashMap
map.put("id1", "2");
map.put("title2", "Lucene");
map.put("content", "它提供了一个分布式的web接口");
IndexResponse response = client.prepareIndex("blog4", "article",
"3").setSource(map).execute().actionGet();
//打印返回的结果
System.out.println("结果:" + response.getResult());
System.out.println("id:" + response.getId());
System.out.println("index:" + response.getIndex());
System.out.println("type:" + response.getType());
System.out.println("版本:" + response.getVersion());
//关闭资源
client.close();
}
4 词条查询
```java
//词条查询
@Test
public void queryTerm() {
SearchResponse response =
client.prepareSearch("blog4").setTypes("article").setQuery(QueryBuilders.termQue
ry("content","提供")).get();
//获取查询命中结果
SearchHits hits = response.getHits();
System.out.println("结果条数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
```
5)结果查看
Store 的解释:
使用 elasticsearch 时碰上了很迷惑的地方,我看官方文档说 store 默认是 no ,我想当然的理解为也就是说这个 fifield 是不会 store 的,但是查询的时候也能查询出来,经过查找资料了解到原来 store 的意思是,是否在 source 之外在独立存储一份,这里要说一下 _source 这是源文档,当你索引数据的时候,elasticsearch 会保存一份源文档到 _source ,如果文档的某一字段设置了 store 为 yes (默认为 no),这时候会在 _source 存储之外再为这个字段独立进行存储,这么做的目的主要是针对内容比较多的字段,放到 _source 返回的话,因为source 是把所有字段保存为一份文档,命中后读取只需要一次 IO,包含内容特别多的字段会很占带宽影响性能,通常我们也不需要完整的内容返回(可能只关心摘要),这时候就没必要放到 _source 里一起返回了(当然也可以在查询时指定返回字段)。