-
在此之前,ES所有的查询都是针对整个词进行操作,也就是说倒排索引存了
hello
这个词,一定得输入hello才能找到这个词,输入 h 或是 he 都找不到倒排索引中的hello
-
然而在现实情况下,用户已经渐渐习惯在输入完查询内容之前,就能为他们展现搜索结果,这就是所谓的即时搜索(instant search),或是可以称为 输入即搜索(search-as-you-type)
-
虽然ES提供了一系列的前缀搜索match_phrase、prefix、wildcard、regexp,然而这样的查询的性能非常差,要知道用户每多输入一个新的字母,就意味著要重新进行一次搜索,在实时的web系统中,100毫秒可能就会是一个难以忍受的延迟
-
因此为了加快 输入即搜索 的查询效率,可以改使用
edge n-gram
建立索引,如此可以避免使用前缀查询,在建立索引时就进行优化,使用空间换取时间,让查询的速率增快
-
-
使用
edge n-gram
建立索引-
假设有一个词
hello
,普通建索引时,就是把这个词hello
放入倒排索引-
用户输入h、he时会找不到索引(倒排索引中只有hello),因此匹配失败
-
-
而对于输入即搜索这种应用场景,可以使用一种特殊的n-gram,称爲 边界n-grams (edge n-grams)
-
所谓的edge n-gram,就是指它会固定词语开始的一边滑动窗口,他的结果取决于 n 的选择长度
-
以单词
hello
爲例,它的edge n-gram的结果如下h he hel hell hello
-
因此可以发现到,在使用edge n-gram建索引时,一个单词会生成好几个索引,而这些索引一定是重头开始
-
这符合了输入即搜索的特性,即是用户打h、he能找到倒排中的索引
h
、he
,而这些索引对应著的数据就是hello
-
-
-
具体实例
-
建立索引时使用edge n-gram的token过滤器,为每个经过这个token过滤器的词条们,都生成从头开始的字符组合
-
假设有一个输入
QUICK! RUN!
,分词器会先将它分词成两个词quick
和r
-
-
ElasticSearch - 输入即搜索 edge n-gram
最新推荐文章于 2025-06-11 09:05:55 发布
