逻辑如图 https://i.loli.net/2019/01/02/5c2c689c3723c.png
不知道怎么下手,全匹配加了在关键词前后加了冒号,代码如下 builder.must(QueryBuilders.queryStringQuery("""+title+""").analyzer("ik").defaultField("title"))
但是搜索“三峡航运”或者“三峡”,“航运” 却搜索不出来“三峡航运数据中心平台建设项目”,如果搜索“三峡”,“中心”可以,“三峡”,“航”可以,搞不懂是为什么,求大佬们指点
1
yuikns 2019-01-02 15:51:19 +08:00
1. 现在还有 ik? https://github.com/medcl/elasticsearch-analysis-ik
> Analyzer: ik_smart , ik_max_word , Tokenizer: ik_smart , ik_max_word 2. 我觉得不需要 analyzer("ik") 这个。在 mapping 中定义好 tokenizer & analyzer 比如 ik_max_word,query 直接查询即可。你是不是 mapping 里面和 es 里面不匹配啊 最后 build 的 query post 个 json 自己看看? |
2
twocold0451 2019-01-02 15:55:04 +08:00
近期再做 solr 搜索的项目用到 ik 分词器,不知道一下见解能否帮到你。。
title 字段用到了 ik 分词,你要去看他将“三峡航运数据中心平台建设项目” 分成哪些词。我用我的系统看了下,下图。 https://imgur.com/a/KohEnii 分词结果中并没有“三峡航运”这个词,这个词不会被索引进库,所以用“三峡航运”搜不到结果。如果想用“三峡航运”搜到结果,我这有 2 个解决办法。 1.将“三峡航运”添加到词库,具体方法网上找找,不太清楚 elasticsearch 要怎么做。 2.建立一个不分词,内容和 title 一样的字段,查询的时候同时查这 2 个字段,不分词的这个字段全词匹配。 刚接触这块,有错误请指出。 |
3
yuikns 2019-01-02 15:55:20 +08:00
https://github.com/medcl/elasticsearch-analysis-ik#changes
哦,题目中说的这种情况下应该是试试用下 ik_smart。 再试试自己定义词典,不过若非行业术语,可能就比较 tricky 了 |