搜索的智能提示是一个搜索应用的标配,主要作用是避免用户输入错误的搜索词,并将用户引导到相应的关键词上,提升用户体验。
由于中文的特点,如果搜索自动提示可以支持拼音的话会给用户带来更大的方便,免得切换输入法。
目前大多数的电子商务网站都支持拼音提示功能。
-
基于用户的历史搜索关键字进行提示
-
同时支持汉字,拼音输入
-
支持前缀匹配,比如输入“ch”可能提示出“重庆”
-
支持缩写输入,比如输入“cq”能提示出“重庆”
-
多音字支持,比如输入“chongqing”或者“zhongqing”都能提示出“重庆”
-
输出结果,根据用户查询关键字的频率进行排序,暂时不考虑个性化需求
三、分析与解决方案
假设我们的搜索应用是基于solrcloud实现的,主要是对商家信息进行搜索,包括商家名称(store_name)、商家地址(address)。
(1). 用户每天输入大量的查询关键字,我们把查询的关键字记录下来,目前通过异步队列写入到mysql中,后期考虑写入到hbase中
(2). 用户输入的关键字可能是汉字、数字,英文,拼音,特殊字符等等,由于需要实现拼音提示,所以我们需要把汉字转换成拼音,java中考虑使用pinyin4j组件实现转换。
(3). 汉字转换拼音的过程中,顺便提取出拼音缩写,如“chongqing”,"zhongqing"--->"cq","zq"
(4). 要支持多音字提示,对查询串转换成拼音后,需要实现一个全排列组合,考虑到查询串可能比较长导致全排列比较的,具体算法需要做限制处理。
1. Solr Suggest实现智能提示
首先Solr作为一个应用广泛的搜索引擎系统,它内置了智能提示功能,叫做Suggest模块。该模块有两种可选方案做智能提示:
(1)、基于提示词文本做智能提示
(2)、基于索引中得某个字段建立索引词库做智能提示
配置如下:
schema.xml:
<field name="suggest" type="suggest_text" indexed="true" stored="false" multiValued="true" />
----------------------------------------------
<copyField source="store_name" dest="suggest" />
<copyField source="address" dest="suggest" />
----------------------------------------------
<fieldType name="suggest_text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.SynonymFilterFactory"
synonyms="synonyms.txt"
ignoreCase="true"
expand="true" />
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
</analyzer>
</fieldType>
solrconfig.xml
<searchComponent class="solr.SpellCheckComponent" name="suggest">
<str name="queryAnalyzerFieldType">suggest_text</str>
<lst name="spellchecker">
<str name="name">suggest</str>
<str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
<str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
<str name="field">suggest</str>
<float name="threshold">0</float>
<str name="buildOnCommit">true</str>
</lst>
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">suggest</str>
<str name="classname">solr.DirectSolrSpellChecker</str>
<str name="distanceMeasure">internal</str>
<float name="accuracy">0.2</float>
<int name="maxEdits">2</int>
<int name="minPrefix">1</int>
<int name="maxInspections">50</int>
<int name="minQueryLength">2</int>
<float name="maxQueryFrequency">0.01</float>
</lst>
<lst name="spellchecker">
<str name="name">wordbreak</str>
<str name="classname">solr.WordBreakSolrSpellChecker</str>
<str name="field">suggest</str>
<str name="combineWords">true</str>
<str name="breakWords">true</str>
<int name="maxChanges">10</int>
</lst>
</searchComponent>
<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest">
<lst name="defaults">
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">default</str>
<str name="spellcheck.dictionary">wordbreak</str>
<str name="spellcheck.dictionary">suggest</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.count">10</str>
<str name="spellcheck.collate">true</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
配置完成后,启动solrcloud:
solr1:
java -Djetty.port=8983 -Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=myconf -DzkRun -DnumShards=1 -jar start.jar &
solr2:
java -Djetty.port=7574 -DzkHost=localhost:9983 -Dcollection.configName=myconf -DnumShards=1 -jar start.jar &
第一次查询时,添加spellcheck.build=true参数来触发spellckecker建立索引,
http://localhost:8983/solr/collection1/suggest?q=cq&spellcheck.build=true&distrib=false
http://localhost:8983/solr/collection1/suggest?q=cq&distrib=false
该方法存在的问题是:
返回的结果是基于索引中字段的词频进行排序,不是用户搜索关键字的频率,因此不能将一些热门关键字排在前面(网上有人提到定制SuggestWordScoreComparator来实现)
拼音提示,多音字,缩写还是要另外加索引字段
2. Solrcloud建立单独的collection,利用solr前缀查询实现
配置如下:
solr.xml:
<cores adminPath="/admin/cores" defaultCoreName="collection1" host="${host:}" hostPort="${jetty.port:8983}" hostContext="${hostContext:solr}" zkClientTimeout="${zkClientTimeout:15000}">
<core name="collection1" instanceDir="collection1" />
<core name="collection2" instanceDir="collection2" />
</cores>
cp -r collection1 collection2
修改collection2中的schema.xml和solrconfig.xml
schema.xml:
-----------------------fields--------------------------------
<field name="kw" type="string" indexed="true" stored="true" />
<field name="pinyin" type="string" indexed="true" stored="false" multiValued="true"/>
<field name="abbre" type="string" indexed="true" stored="false" multiValued="true"/>
<field name="kwfreq" type="int" indexed="true" stored="true" />
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="suggest" type="suggest_text" indexed="true" stored="false" multiValued="true" />
------------------multiValued表示字段是多值的-------------------------------------
kw为原始关键字
pinyin和abbre的multiValued=true,在使用solrj建此索引时,定义成集合类型即可:如关键字“重庆”的pinyin字段为{chongqing,zhongqing}, abbre字段为{cq, zq}
kwfreq为用户搜索关键的频率,用于查询的时候排序
------------------uk----------------------------------
<uniqueKey>kw</uniqueKey>
<defaultSearchField>suggest</defaultSearchField>
-------------------------------------------------------
<copyField source="kw" dest="suggest" />
<copyField source="pinyin" dest="suggest" />
<copyField source="abbre" dest="suggest" />
------------------suggest_text----------------------------------
<!-- suggest type-->
<fieldType name="suggest_text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.SynonymFilterFactory"
synonyms="synonyms.txt"
ignoreCase="true"
expand="true" />
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
</analyzer>
</fieldType>
启动命令:
solr1:
java -Xms1024m -Xmx1024m -Djetty.port=8983 -Dbootstrap_conf=true -DzkHost=
localhost:9983
-DnumShards=1 -jar start.jar &
solr2:
java -Djetty.port=7574 -DzkHost=
localhost:9983
-DnumShards=1 -jar start.jar &
solrj前缀查询语法:
private SolrQuery getSuggestQuery(String prefix, Integer limit) {
SolrQuery solrQuery = new SolrQuery();
StringBuilder sb = new StringBuilder();
sb.append("kw:").append(prefix).append("*");
sb.append(" or pinyin:").append(prefix).append("*");
sb.append(" or abbre:").append(prefix).append("*");
solrQuery.setQuery(sb.toString());
solrQuery.addField("kw");
solrQuery.addField("kwfreq");
solrQuery.addSort("kwfreq", SolrQuery.ORDER.desc);
solrQuery.setStart(0);
solrQuery.setRows(limit);
return solrQuery;
3. mongodb实现拼音智能提示
实现原理类似于方案2,利用mongodb强调的查询功能,数组和正则匹配。参考
http://www.2cto.com/database/201203/123450.html
经过测试,效果与方案2类似。
以上三个方案都能实现搜索关键字智能提示,方案1还需要研究完善才能实现基于用户搜索频率热词排序,方案3需要另外部署mongodb服务,不利用维护,所以本人在实际项目中采用了方案2.
原文地址:http://zhanshenny.iteye.com/blog/1923073
一、背景 搜索的智能提示是一个搜索应用的标配,主要作用是避免用户输入错误的搜索词,并将用户引导到相应的关键词上,提升用户体验。 由于中文的特点,如果搜索自动提示可以支持拼音的话会给用户带来更大的方便,免得切换输入法。 目前大多数的电子商务网站都支持拼音提示功能。 二、目标基于用户的历史搜索关键字进行提示同时支持汉字,拼音输入支持前缀匹配,比如输入“
主要功能:
AI生成VBA代码 VBA代码解释器 VBA代码库收藏管理, VBA
中文
代码库输入
提示
, VBA变量名首字母输入
提示
VBA函数过程输入
提示
, VBA代码自动对齐排版, VBA代码混淆, VBA工程密码破解, Excel VBA模块隐藏保护, VBA颜色修改器, VBA代码行号显示
亮点功能:
关键字
+空格, 神键手输入
提示
,代码
智能
补齐 双击Tab代码对齐, ALT+L字符串拼接, SHIFT+ENTER自动换行,括号自动补齐,代码区
中文
标点符号自动矫正,窗体控件批量生成 ,变量名及函数名
中文
拼音
首字母输入
提示
, 代码行号
主要功能:
VBA代码库收藏管理, VBA
中文
代码库输入
提示
, VBA变量名首字母输入
提示
VBA函数过程输入
提示
, VBA代码自动对齐排版, VBA代码混淆, VBA工程密码破解, Excel VBA模块隐藏保护, VBA颜色修改器, VBA代码行号显示
亮点功能:
关键字
+空格, 神键手输入
提示
,代码
智能
补齐 双击Tab代码对齐, ALT+L字符串拼接, SHIFT+ENTER自动换行,括号自动补齐,代码区
中文
标点符号自动矫正,窗体控件批量生成 ,变量名及函数名
中文
拼音
首字母输入
提示
, 代码行号
所有windows7以上系统的的VBA环境都可以
Excel VBA代码助手,word VBA代码助手,ppt VBA代码助手,Outlook VBA代码助手,Access VBA代码助手,AutoCad VBA代码助手....
下拉框
提示
词也称Suggestion(查询词
提示
),这已经是
搜索
引擎必备的一个功能了,而问答系统则是
搜索
引擎的精简版,也需要检索
提示
功能,给用户带来便捷,提高产品的体验感。
当你在
搜索
框进行输入时,
搜索
框会打开下拉的
提示
框,动态的向你
提示
一些与你已经出入内容相关的查询关键词。如果在
提示
框中看到自己所希望输入的关键词,直接用鼠标点击或键盘选择即可进行
搜索
,减少了用户输入的字符数量。
当然
搜索
框提...
scrapy+py
mongo
爬取符号库所有
拼音
开头文字
今天又看了一下
mongo
数据库的基本使用,虽然还不明白分布式爬虫这种高级概念,但是简单使用一下还是可以的,全当拿来练手。
mongo
db的安装以及使用可以查看
Mongo
DB
中文
网
py
mongo
的安装 pip install py
mongo
即可,使用的话可以查看这篇文章
scrapy的基础概念我上篇都有讲,并且这些基础概念都是可以
搜索
到...
这里我们对title做suggest推荐
搜索
, 例如
搜索
"魔兽世界"和"moshoushijie" 都能出现 "魔兽世界XXXX"的相关推荐词
此时我们需要对title的词建立
拼音
索引, 而后对建立组合列copyField类型的字段 tt ..
代码片段 schema.xml
<fields>
<fie...
------ 本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 ------
搜索
引擎的
搜索
关键词
提示
功能,你应该不陌生吧!当你在
搜索
引擎的
搜索
框上,输入要
搜索
的文字的某一部分的时候,
搜索
引擎就会自动弹出下拉框,里面是各种关键词
提示
。你可以直接从下拉框中选择你要
搜索
的东西。
尽管这个功能我们几乎天天在用,作为一名工程师,你是否思考过,它是怎么
实现
的呢?它底层使用的是哪一种数据结构和算法...
Mongo
DB 3.4 已经发布,本文主要介绍 3.4 版本在功能特性上做的改进,内容翻译自 [https://docs.
mongo
db.com/manual/release-notes/3.4/?_ga=1.74729233.2005306875.1453858874)。
分片集群(Sharded Cluster)
Membership Awarene...
1.字符串按字母顺序排序
db.entiy.find({}).collation({"locale": "zh", numericOrdering:true}).sort({name:1});
这是
mongo
db下nosql语句书写。
结合
mongo
Template;需要以下处理:
Query query = new Query();
// 园区id campusId
Criteria criteria = Criteria.where("campusId").is(pagePa...
92find.com上的一个js插件实现了搜索框自动补全托管服务,
只要一行javascript代码就可以实现百度、淘宝搜索框提示的全部功能
比如:汉字拼音匹配、拼音首字母匹配、模糊搜索、智能容错,还可以自定义提示词汇及其排序权重
花五分钟我的网站就可以部署同百度、淘宝一样强大好用的输入提示功能
同时兼容IE、Firefox、Safari、Chrome、Opera各种浏览器
兼容ios、Android、Windows