把服务器修好之后环境也都重新配置了下,其中一个数据源需要做索引,之前一直用的 Sphinx,但是性能感觉不太好。在哥们的推荐下尝试了一下 ElasticSearch,配置是麻烦了点但是总体感觉还不错,并且成功实现了一元分词。

需求是有一个数据表,有如下字段:id、name、author、date、serialnum、location、telephone。id 字段是这条数据的唯一 ID,其他字段有些是纯数字,有些是汉字和数字和英字混合。必须要做到可以模糊匹配任何字段,以及多条件字段匹配。

测试数据如下:

id name author date serialnum location telephone

1,测试A,作者A,20180101,AFA9939FABBA93,韩国首尔市江南区베스트웨스턴프리미어호텔B104,821012345678

2,测试B,作者ASD,20140506,EFJBJAI91984,中国北京市朝阳区飘HOME连锁酒店405,861062345678

3,测试C,作者ADDDD 作者BDASD 作者CDAF, 20160511,ELAKJF92818449FA,美国加利福尼亚州洛杉矶市Downtown103,12345679876

查询 1:호텔 期待返回:ID 1

查询 2:5678 北京 期待返回:ID 2

查询 3:JAI9198 期待返回:ID 2

查询4:者BDAS 期待返回:ID 3

本来想吧,直接把数据用 Logstash 导入到 ElasticSearch,结果试了一下发现不行,没办法完成期待的查询。然后 Google 了一圈发现没有太好的配置,没有这么奇葩的分词方法的。看了下官方文档最后弄明白了,不得不说 ElasticSearch 的文档好差劲啊。


curl -XPUT 'localhost:9200/infomationtest1?pretty' -H 'Content-Type: application/json' -d'
{
"settings": {
"analysis": {
"analyzer": {
"ngram_analyzer": {
"tokenizer": "ngram_tokenizer"
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "ngram",
"min_gram": 1,
"max_gram": 999999,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"data": {
"properties": {
"name": {
"type": "text",
"copy_to": "kw"
},"author": {
"type": "text",
"copy_to": "kw"
},"date": {
"type": "text",
"copy_to": "kw"
},"serialnum": {
"type": "text",
"copy_to": "kw"
},"location": {
"type": "text",
"copy_to": "kw"
},"telephone": {
"type": "text",
"copy_to": "kw"
},"kw": {
"type": "text",
"analyzer": "ngram_analyzer"
}
}
}
}
}'

博客貌似没办法格式化 JSON,所以凑合看吧,或者放到 JSON Viewer 里。

这个意思是建立一个索引(index),然后定义一个 ngram_tokenizer,之后把所有的字段复制到(copy_to)kw 这个字段上,之后对字段 kw 进行 ngram 一元分词。因为不知道什么原因 ElasticSearch 把 _all 这个通配符给 deprecated 掉了。

查询的时候这样:


curl -XPOST 'http://localhost:9200/informationtest1/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
"query": {
"bool": {
"must": [{
"term": {
"kw": "条件A"
}
},{
"term": {
"kw": "条件B"
}
},{
"term": {
"kw": "条件C"
}
}]
}
}
}'

先跑一段时间看看效果怎么样,折腾的好累。。。

1 Comment

Leave a Reply

Your email address will not be published.

*

code