24.通过ngram分词机制实现index-time搜索推荐

一、ngram和index-time搜索推荐原理

1、什么是ngram

假设有一个单词:quick,在5种长度下的ngram情况如下:

ngram length=1,q u i c k

ngram length=2,qu ui ic ck

ngram length=3,qui uic ick

ngram length=4,quic uick

ngram length=5,quick

什么是edge ngram,就是首字母后进行ngram。比如quick这个单词,拆分如下:

  • q
  • qu
  • qui
  • quic
  • quick

使用edge ngram将每个单词都进行进一步的分词切分,用切分后的ngram来实现前缀搜索推荐功能,搜索的时候,不用再根据一个前缀,然后扫描整个倒排索引了; 简单的拿前缀去倒排索引中匹配即可,如果匹配上了就不再进行其他扫描。这就类似match的全文检索。

2、什么是index-time

index-time搜索推荐是指在建立索引时就把搜索推荐的倒排索引建立好,在搜索时就不用再根据前缀去建立。

min ngram = 1,是指推荐的分词最小的个字母个数,如hello 分词为h

max ngram = 3,是指推荐的分词最大的个字母个灵敏,如hello 分词为hel之后就不再进行分词,也就是说不再分词为hell。

二、实验

1、建立索引

PUT /my_index

{

"settings": {

"analysis": {

"filter": {

"autocomplete_filter": {

"type": "edge_ngram",

"min_gram": 1,

"max_gram": 20

}

},

"analyzer": {

"autocomplete": {

"type": "custom",

"tokenizer": "standard",

"filter": [

"lowercase",

"autocomplete_filter"

]

}

}

}

}

}

2、查看分词情况

GET /my_index/_analyze

{

"analyzer": "autocomplete",

"text": "quick brown"

}

3、加入搜索数据的mapping

PUT /my_index/_mapping/my_type

{

"properties": {

"title": {

"type": "string",

"analyzer": "autocomplete",

"search_analyzer": "standard"

}

}

}

4、进行推荐搜索

GET /my_index/my_type/_search

{

"query": {

"match_phrase": {

"title": "hello w"

}

}

}

GET /my_index/my_type/_search

{

"query": {

"match": {

"title": "hello w"

}

}

}

如果用match,只有hello的也会出来,全文检索,只是分数比较低

推荐使用match_phrase,要求每个term都有,而且position刚好靠着1位,符合我们的期望的

原文地址:https://www.cnblogs.com/liuqianli/p/8527557.html

时间: 2024-10-11 07:35:57

24.通过ngram分词机制实现index-time搜索推荐的相关文章

lucene创建index和搜索

package com.my.lucene.index; import java.io.File; import java.io.FileReader; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field;

带 IK 分词器的 Luke 和 搜索应用服务器solr

首先在网上查了一下: Solr Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果. Solr引擎 Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能

Elasticsearch教程 Elasticsearch查询语法 Elasticsearch权威指南 深入理解Elasticsearch

课程大纲 第1节结构化搜索_IT技术论坛案例背景介绍 9分钟 第2节结构化搜索_在案例中实战使用term filter来搜索数据 20分钟 第3节结构化搜索_filter执行原理深度剖析(bitset机制与caching机制)18分钟 第4节结构化搜索_在案例中实战基于bool组合多个filter条件来搜索数据 12分钟 第5节结构化搜索_在案例中实战使用terms搜索多个值以及多值搜索结果优化 7分钟 第6节结构化搜索_在案例中实战基于range filter来进行范围过滤 5分钟 第7节深度

Elasticsearch顶尖高手系列-高手进阶篇(最新第二版)

第1节结构化搜索_IT技术论坛案例背景介绍第2节结构化搜索_在案例中实战使用termfilter来搜索数据第3节结构化搜索_filter执行原理深度剖析(bitset机制与caching机制)第4节结构化搜索_在案例中实战基于bool组合多个filter条件来搜索数据第5节结构化搜索_在案例中实战使用terms搜索多个值以及多值搜索结果优化第6节结构化搜索_在案例中实战基于rangefilter来进行范围过滤第7节深度探秘搜索技术_在案例中体验如何手动控制全文检索结果的精准度第8节深度探秘搜索技

Elasticsearch深入8

搜索推荐,search as you type 百度 --> elas --> elasticsearch --> elasticsearch权威指南 GET /my_index/my_type/_search { "query": { "match_phrase_prefix": { "title": "hello d" } } } 原理跟match_phrase类似,唯一的区别,就是把最后一个term作为

基础:从概念理解Lucene的Index(索引)文档模型

转:http://blog.csdn.net/duck_genuine/article/details/6053430 目录(?)[+] Lucene主要有两种文档模型:Document和Field,一个Document可能包含若干个Field. 每一个Field有不同的策略: 1.被索引 or not,将该字段(Field)经过分析(Analyisi)后,加入索引中,并不是原文 . 2.如果被索引,可选择是否保存“term vector”(向量),用于相似检索. 3.可选择是否存储(store

分词技术

目录(?)[+] 我们要理解分词技术先要理解一个概念.那就是查询处理,当用户向搜索引擎提交查询后,搜索引擎接收到用户的信息要做一系列的处理.步骤如下所示: 1.首先是到数据库里面索引相关的信息,这就是查询处理. 那么查询处理又是如何工作的呢?很简单,把用户提交的字符串没有超过3个的中文字,就会直接到数据库索引词汇.超过4个中文字的,首先用分隔符比如空格,标点符号,将查询串分割成若干子查询串. 举个例子.“什么是百度分词技术” 我们就会把这个词分割成“ 什么是,百度,分词技术.”这种分词方法叫做反

lucene+盘古分词

一般的网站都会有都会有搜索的功能,一般实现搜索主要有三种方案 第一种是最差的,也是最不推荐的,使用数据库的模糊查询例如select * form table where 字段 like XXX,这种查询的缺点很明显: (1)       无法查找几个关键词不连在一起的情况 (2)       全表扫描 效率低下 第二种:使用SqlServer的全文本检索功能 举例:select * form table where msg = ‘江苏南京’ 这是就可以写成select * form table

中文分词器性能比较

摘要:本篇是本人在Solr的基础上,配置了中文分词器,并对其进行的性能测试总结,具体包括 使用mmseg4j.IKAnalyzer.Ansj,分别从创建索引效果.创建索引性能.数据搜索效率等方面进行衡量. 具体的Solr使用方法假设读者已有了基础,关于Solr的性能指标见前期的Solr博文. 前提:       Solr提供了一整套的数据检索方案,一台四核CPU.16G内存的机器,千兆网络.需求:       1.对Solr创建索引的效率有一定的要求. 2.中文分词速度要快,搜索速度也要快. 3