开始使用ElasticSearch(八)之模糊检索,多关键字高亮

   根据之前不懈努力的结果,我们终于把基本功能完成了,以为可以交差了。但是其实才刚刚开始!

我们来看看还差些什么?
1.全关键字匹配(等于==)
2.部分匹配(等于like,这里还分前匹配,后匹配,带空格多关键字等)
3.空格多关键字高亮

暂时先搞定这么些,一步步来,步子太大容易扯到蛋。

开始使用ElasticSearch(八)之模糊检索,多关键字高亮

这是之前我们定义的模板,基本上满足的就是简单的匹配条件,现在我们来慢慢优化一下。

开始使用ElasticSearch(八)之模糊检索,多关键字高亮

首先我们定义一个前缀查询,这个是最基本的常规思路查询。
比如用户输入 编号的前面几位,就可以快速的匹配出来,缺点是前缀一定不能断开,不然就搜
不出来,比如搜的数据是:123 678 我输入123能搜出来,但是678不是前缀就出不来了。

开始使用ElasticSearch(八)之模糊检索,多关键字高亮

在这里我用到了matchphraseprefix这个搜索可以用于词组匹配,比如我只输入 ”我是中国人“
那么就会根据分词检索 ,只要有匹配的就会返回结果 这里还允许最后词组与文中的任意分词前缀
匹配,所以当我输入XPZ的时候 XPZ和Opt xpz......的第二个词组匹配。但是问题是我们这边有种
特殊情况,用户可能他知道开头的前缀几个字母,知道中间的几个字母。这种情况下要分段匹配。
显然目前的2个检索是不支持的

开始使用ElasticSearch(八)之模糊检索,多关键字高亮
上面的match查询匹配就会进行分词,根据 "XPZ" "TX"来分段查询。不过还有一种情况,用户只记得中间那
段数字那怎么办呢,感觉现在的条件又不满足了!

开始使用ElasticSearch(八)之模糊检索,多关键字高亮

所以我在搜索条件里面又加了wildcard查询,中文意思就是任意通配符。其实相当于sql里面的like语法,如果
想要在前后都匹配一个通配符的话可以用?。这里我们未知前后有多少个通配符,所以用的,代表查询的是
“前面这里有N个未知单词”1687“后面这里有N个未知单词”。但是我们还记得说好的全文检索功能吗?
前面都是指定的模糊匹配啊,只是某个字段好像不是全文检索耶。
开始使用ElasticSearch(八)之模糊检索,多关键字高亮
所以我在下面加了es提供的query_string查询,这个使用上和match功能差不多。这里也可以使用通配符
,~等。还可以使用正则表达式。我这边设置了allow_leading_wildcard=false禁用了前置通配符。基本上一个
简单的通用的查询基本完成了。那么我们把这些加入到模板试试看效果。
开始使用ElasticSearch(八)之模糊检索,多关键字高亮
开始使用ElasticSearch(八)之模糊检索,多关键字高亮
这边我使用的是typeahead接收数据源作为提示高亮,我们来运行一下。

开始使用ElasticSearch(八)之模糊检索,多关键字高亮
开始使用ElasticSearch(八)之模糊检索,多关键字高亮

有没有发现问题?当我查询一个关键字的时候可以高亮,但是当我空格隔开两个关键字的时候无法高亮展示。
这个肯定不是ES的问题,ES只负责提供查询。那么问题定位到了typeahead上面,查询了文档发现,原来是
typeahead本身默认只支持单关键字高亮,想要多关键字高亮必须另外引用mark.js.

开始使用ElasticSearch(八)之模糊检索,多关键字高亮

引用成功后,还需要修改原来绑定 typeahead的写法。

开始使用ElasticSearch(八)之模糊检索,多关键字高亮
因为使用的mark,所以需要将原有的高亮设置为false,其他写法相对比较简单,修改后运行看一下。

开始使用ElasticSearch(八)之模糊检索,多关键字高亮

终于算是成功了!后面我来做拼音查询,简体繁体处理。到此为止先休息一下。

猜你喜欢

转载自blog.51cto.com/15034497/2590944