好久没有搞文章了,最近项目有需求要用分词,最开始想用solr来着,后来领导死活不用,说是用Elasticsearch ,Elasticsearch 有人维护,所以硬着头皮搞了搞。
我是在windows上试验的,用的最新版本的Elasticsearch 2.3,安装和,插件什么的不就说了,
之后到导入mysql数据库的数据到Elasticsearch中,我首先down了一个http://xbib.org/repository/org/xbib/elasticsearch/importer/elasticsearch-jdbc/2.3.1.0/elasticsearch-jdbc-2.3.1.0-dist.zip
然后解压,去到他的bin目录下找到了mysql-simple-example.bat和log4j2.xml 拷贝到了Elasticsearch的bin目录下,打开mysql-simple-example.bat,发现里面的内容无法执行,所以对这个bat进行了修改
修稿后的内容如下
set DIR=%~dp0
set LIB="%DIR%..\elasticsearch-jdbc-2.3.1.0\lib\*"
set BIN="%DIR%..\elasticsearch-jdbc-2.3.1.0\bin\*"
"E:\jdk1.8.0_77\bin\java" -cp "%LIB%" -Dlog4j.configurationFile=file://%DIR%log4j2.xml
"org.xbib.tools.Runner" "org.xbib.tools.JDBCImporter" jdbc_mysql.json
原来的文件中是有一段json的,我把这段代码放到了一个json文件里名字叫jdbc_mysql.json
内容如下:
{
"type": "jdbc",
"jdbc": {
"url": "jdbc:mysql://ip:3306/database",
"user": "root",
"password": "root",
"sql": "select b.zon_id as _id ,b.zon_nm as zon_nm ,b.zon_shrt_nm as shrt_nm from bus_chinaarea b ",
"index": "database",
"type": "bus_chinese_1"
}
}
几个参数,sql里面的 _id 就是去定义Elasticsearh里面的id的不然它会用Elasticsearch自带的id生成方式
index就是索引名称 我定义成数据库名字
type就是类型 我定义成了表的名字。可能还有一些其他的参数信息,https://github.com/jprante/elasticsearch-jdbc
这里可以找到。
最后就是执行了,Elasticsearch/bin目录下执行mysql-simple-example.bat,mysql数据库的东西就导入了。
然后就是查询了,我用了Elasticsearch的插件head,来执行查询,发现查询的结果并没有分词,后来才明白我导入的时候并没有定义mapping,其实在导入数据的时候有参数去定义mapping,定义了就好了。
但是我并没有这么做,我后来是先在Elasticsearch里面定义了index和type然后给type定义的mapping
ik分词的安装这里就不说了,网上的步骤太多了
put http://127.0.0.1:9200/entp_cr1/bus_chinese_1/_mapping
{
"bus_chinese_1": {
"_all": {
"analyzer": "ik",
"search_analyzer": "ik",
"term_vector": "no",
"store": "false"
},
"properties": {
"zon_nm": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"analyzer": "ik",
"search_analyzer": "ik",
"include_in_all": "true",
"boost": 8
},
"shrt_nm": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"analyzer": "ik",
"search_analyzer": "ik",
"include_in_all": "true",
"boost": 8
}
}
}
}
定义了mapping之后我又重新导入了数据,然后执行的查询
post http://127.0.0.1:9200//entp_cr1/bus_chinese_1/_search
{
"query" : {
"query_string" : {
"default_field" : "zon_nm",
"query" : "北京"
}
}
}
部分执行结果
hits: {
total: 40
max_score: 31.53391
hits: [
{
_index: entp_cr1
_type: bus_chinese_1
_id: 110000
_score: 31.53391
_source: {
zon_nm: 北京市
shrt_nm: 北京市
}
}
{
_index: entp_cr1
_type: bus_chinese_1
_id: 110200
_score: 28.256222
_source: {
zon_nm: 北京市县
shrt_nm: 县
}
}
{
_index: entp_cr1
_type: bus_chinese_1
_id: 110102
_score: 24.21962
_source: {
zon_nm: 北京市西城区
shrt_nm: 西城区
}
}
{
最后发现要学的东西还有很多啊 ,还是努力看文档吧,什么mysql动态更新,热更新ik词库,还有Elasticsearch的文档只看了个大概,我的天,还是慢慢来吧~~
未完待续~~