怎么查不到呢?
通过关键字搜索是大家经常使用的功能,怎么查不到呢的疑惑也时常出现在我们耳边,那到底是为啥呢?
我们的搜索一般都是基于es来实现的,中文的搜索经常使用的又是ik分词器,针对不同的使用场景,我们一般会使用分词本来维护ik分词,但是分词本很难覆盖用户所有的需求,所以查不到的问题就会经常遇到,有什么办法可以解决呢?
解决方案
- 修改ik分词插件
修改方法可以度娘搜一搜,优点可以通过更新数据库实时的更新分词,缺点呢,我稍微看了下,历史数据可能不会刷新(没有深入看,如果可以当我没说), 技术要求也相对较高一点点,毕竟要改源码,如果使用云es可能不支持访问外网~ - 手动分词查询
使用list通过termsQuery查询,这样做的好处是没啥技术要求,每次保存时候keyword通过自己喜欢的规则进行分割,然后保存为list,查询时候通过list来查询关键字,相当于自己维护了一个分词,缺点是历史数据需要重新刷,而且总感觉怪怪的~ - 手动拆词查询
这一种是我们目前使用的,对性能会有影响,所以改造后需要看性能情况,谨慎使用。
什么叫手动拆词呢?就是输入词后对关键字进行硬拆解,比如 查询优化,拆成 查询优化、查、询、优、化、查询、询优、优化(当然也可以根据所需进行优化调整拆词),拆词后通过拆后的词语进行查询,当然底层还是基于ik分词,查询出来数据后,内存中进行筛选,将匹配值高的放到前面,比如查询优化全匹配放在最上方,只匹配两个字的放到下方,以此类推,这样操作不管词库如何更新,返回的信息都是可以让用户接受的~
查询示例
GET /index_*****/_search
{
"from": 0,
"size": 1000,
"query": {
"bool": {
"must": [{
"bool": {
"should": [{
"match": {
"text_detail": {
"query": "查",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1.0
}
}
}, {
"match": {
"text_detail": {
"query": "询",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1.0
}
}
}, {
"match": {
"text_detail": {
"query": "优",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1.0
}
}
}, {
"match": {
"text_detail": {
"query": "化",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1.0
}
}
}, {
"match": {
"text_detail": {
"query": "查询",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1.0
}
}
}, {
"match": {
"text_detail": {
"query": "优化",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1.0
}
}
}],
"adjust_pure_negative": true,
"boost": 1.0
}
}]
}
}
}