在我自己做项目使用ES的时候,发现了黑马没教的方法,以及一些它项目的小问题
搜索时的匹配方法
这个boolQuery().should
我的项目是通过文章的标题title和内容content来进行搜索
但是黑马它的项目只用了must
如果我们的title和content都用must,那么我们的搜索内容就是 必须同时匹配到content和title 这样子是错误的
所以我们用should(),这个是我们可能匹配到
可以这样子理解
must()表示必须,should表示或者
自动补全的字段必须是Completion类型
我们的自动补全的Suggestion字段其实是一个List<>一样的类型
所以我们的java代码中的对象是List类型
我的项目中我是把city,和title这两个放到我们的List中,然后这个来实现我们的自动补全
黑马项目的自动补全的不足
首先黑马的教程提出了一个例子
狮子,和虱子,我们搜索的时候不应该都转成拼音shizi
这样子就会导致两个都搜索出来从而导致我们的搜索结果的错误
所以我们创建时的分词器用拼音,搜索时的分词器就不用拼音了
我们指定两种分词器,这样就决定了我们的索引库的结构
analyzer是我们的创建时的分词器
search_analyzer是我们的搜索时的分词器
这样我们就实现了中文搜索的时候用中文搜索,然后拼音搜索的时候用拼音搜索
我们搜索 动 成功用中文搜索了
我们搜索dong 也成功用拼音搜索,搜到了 东
也就是说我们的ES的搜索是没有问题,因为我们的索引的结构已经指定了
中文搜索的时候使用中文 英文搜索的时候使用英文
但是我们的自动补全,其实有问题
我们的suggestion自动补全字段,其实也是要中文搜索的时候补全中文,拼音搜索的时候补全拼音
但是黑马的教程里面,它的自动补全没有中文搜索的时候补全中文
如果我们不指定中文搜索的时候补全中文
那么我们搜索 “导”这个字的时候 它的底层会转成 d 从而搜索出一堆无关的东西
例如搜索出了这些
所以我们重新弄索引,重新指定我们的搜索的分词器
这样我们就能实现
Suggestion字段的时候
拼音的时候拼音补全
中文的时候中文补全
例如我们搜索dao
搜索 导
搜索 动
ok,全部成功了
黑马的课程里面没有给Suggetion字段的补全弄成拼音的时候用拼音搜索补全,中文搜索时用中文搜索补全,从而造成了自动补全的问题,这样子就没有问题了