功能需求

全文检索搜索引擎都会有这样一个功能:输入一个字符便自动提示出可选的短语:

要实现这种功能,可以利用solr的SuggestComponent,SuggestComponent这种方法利用Lucene的Suggester实现,并支持Lucene中可用的所有查找实现。

实现

1. 配置 managed-schema文件

配置自己core文件夹conf下的managed-schema文件

这个是自己的字段:

   <field name="name" type="string"  indexed="true" stored="true"/>
<field name="username" type="string" indexed="true" stored="true"/>
<field name="password" type="string" indexed="true" stored="true"/>
<field name="phone" type="string" indexed="true" stored="true"/>
新建一个suggest_username字段,并将username的值拷贝到suggest_username字段:
<field name="suggest_username" type="text_suggest"  indexed="true" stored="true"/>
<copyField source="username" dest="suggest_username"/>

copyField的source表示源,dest表示目标。

新建一个fieldType专门用于搜索建议:
   <fieldType name="text_suggest" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
</analyzer>
</fieldType>
  • tokenizer就是分词器,官方解释:

The job of a tokenizer is to break up a stream of text into tokens, where each token is (usually) a sub-sequence of the characters in the text。

就是指将文本流分解为标记tokens,这写tokens也是文本的子序列。

The job of a filter is usually easier than that of a tokenizer since in most cases a filter looks at each token in the stream sequentially and decides whether to pass it along, replace it or discard it.

不同的过滤器将输入流替换或者丢弃或者直接通过。

2. 配置solrconfig.xml文件

solrconfig.xml文件也在新建核心core的conf文件夹下

加入searchComponent
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">AnalyzingSuggester</str>
<str name="lookupImpl">AnalyzingLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">suggest_username</str>
<str name="weightField">suggest_username</str>
<str name="payloadField">id</str>
<str name="suggestAnalyzerFieldType">text_suggest</str>
<str name="buildOnStartup">false</str>
</lst>
</searchComponent>

在searchComponent中的suggester需要配置一些参数。

  • name ;suggest名字
  • lookupImpl;查找不同算法实现,根据需要选择。
  • dictionaryImpl;dictionaryImpl。
  • field;建议的字段,如果是对多个字段做建议,就把多个字段拷贝到一个字段里面。即在定义filed的时候,定义为允许多值。
  • weightField;表示权重。
  • payloadField ;用于返回某一个值。
  • suggestAnalyzerFieldType;field字段的类型。
  • buildOnStartup;启动的时候构建建议索引。
加入一个requestHandler用于建议:solr.SearchHandler
  <requestHandler name="/suggest" class="solr.SearchHandler"
startup="lazy" >
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.count">10</str>
</lst>
<arr name="components">
<!-- 上面配置的searchComponent名字suggest -->
<str>suggest</str>
</arr>
</requestHandler>

这里 suggest就是上面配置的searchComponent名字suggest。

测试

通过浏览器地址栏输入连接测试:

http://127.0.0.1:8983/solr/user/suggest?suggest=true&suggest.build=true&suggest.dictionary=AnalyzingSuggester&suggest.q=a

部分参数说明
  • suggest.build=true ;表示构建suggest的索引,全部构建会耗时。可优化。
  • suggest.dictionary=AnalyzingSuggester ;指明使用上面加入的suggester字典组件名字
  • suggest.q=a ;suggest查询内容。
请求具体参数地址:

https://lucene.apache.org/solr/guide/8_1/suggester.html#suggest-request-handler-parameters

返回结果


"responseHeader": {
"status": 0,
"QTime": 10
},
"command": "build",
"suggest": {
"AnalyzingSuggester": {
"aoa": {
"numFound": 3,
"suggestions": [
{
"term": "aoa lee",
"weight": 0,
"payload": "7859b42e-3428-40c0-9036-6d50767a5ff2"
},
{
"term": "aoa lee key",
"weight": 0,
"payload": "0bead5d5-2570-44ba-830b-030f8a888ea3"
},
{
"term": "aoa lee key lol bob",
"weight": 0,
"payload": "9cc3c4d7-7d34-422b-8164-a4c4c92caa08"
}
]
}
}
}
}

返回的结果中主要有三个参数:

  • term ;表示命中的结果记录
  • weight ;表示权重
  • payload ;表示负载,也可用于返回某一个值,这里我们在searchComponent配置的 id表示负载返回我们的id,可以通过id做其他业务需求。

【搜索引擎】Solr Suggester 实现全文检索功能-分词和和自动提示的更多相关文章

  1. PHP+mysql数据库开发搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))

    PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a)   robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robb ...

  2. 【搜索引擎】 PostgreSQL 10 实时全文检索和分词、相似搜索、模糊匹配实现类似Google搜索自动提示

    需求分析 要通过PostgreSQL实现类似Google搜索自动提示的功能,例如要实现一个查询海量数据中的商品名字,每次输入就提示用户各种相关搜索选项,例如淘宝.京东等电商查询 思路 这个功能可以用 ...

  3. 在ef core中使用postgres数据库的全文检索功能实战

    起源 之前做的很多项目都使用solr/elasticsearch作为全文检索引擎,它们功能全面而强大,但是对于较小的项目而言,构建和维护成本显然过高,尤其是从关系数据库/文档数据库到全文检索引擎的数据 ...

  4. 搜索引擎solr和elasticsearch

    刚开始接触搜索引擎,网上收集了一些资料,在这里整理了一下分享给大家. 一.关于搜索引擎 搜索引擎(Search Engine)是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组 ...

  5. Lucene全文检索_分词_复杂搜索_中文分词器

    1 Lucene简介 Lucene是apache下的一个开源的全文检索引擎工具包. 1.1 全文检索(Full-text Search)  1.1.1 定义 全文检索就是先分词创建索引,再执行搜索的过 ...

  6. Solr 5.x集成中文分词word,mmseg4j

    使用标准分词器,如图: 使用word分词器 下载word-1.3.jar,注意solr的版本和word分词的版本 将文件word-1.3.jar拷贝至文件夹C:\workspace\Tomcat7.0 ...

  7. 01——Solr学习之全文检索服务系统的基础认识

    一.为什么要用Solr,Solr是个什么东西? 1.1.Solr是个开源的搜索服务器 1.2.我们用Solr主要实现搜索功能,一般的网站首页都会有一个大大的搜索框,用来搜索此网站上的商品啊什么的,如下 ...

  8. Solr4.4入门,介绍Solr的安装、IK分词器的配置及高亮查询结果(转)

    一.Windows下安装solr-4.4.0 1.  下载solr.4.4 2.  下载绿色版tomcat6.0.18 3.  解压下载的solr到d:\study\solr,将dist目录下的sol ...

  9. 【ELK】【docker】【elasticsearch】1. 使用Docker和Elasticsearch+ kibana 5.6.9 搭建全文本搜索引擎应用 集群,安装ik分词器

    系列文章:[建议从第二章开始] [ELK][docker][elasticsearch]1. 使用Docker和Elasticsearch+ kibana 5.6.9 搭建全文本搜索引擎应用 集群,安 ...

随机推荐

  1. GridLayout网格布局

    网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式 ...

  2. 常用编程软件站点、镜像站、科技类 PDF

    0. 图书站点 Library Genesis 1. Python 包的下载 https://pypi.python.org/pypi/ 在域名的最后加上任何你想下载的第三方的包,比如 theano: ...

  3. C++一个简单的手柄类模板

    #ifndef HANDLE_H #define HANDLE_H #include "Animal.h" template <typename T> class Ha ...

  4. TCP 报文段结构

      源端口.目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信.源端口.目标端口是用 ...

  5. WPF中制作立体效果的文字或LOGO图形(续)

    原文:WPF中制作立体效果的文字或LOGO图形(续) 上篇"WPF中制作立体效果的文字或LOGO图形"(http://blog.csdn.net/johnsuna/archive/ ...

  6. QT 内存文件映射就是如此简单!

    QFile file(fileName); file.open(QIODevice::ReadWrite ); uchar* fpr = file.map(0, file.size());//映射文件 ...

  7. android圆形旋转菜单,而对于移动转换功能支持

    LZ该公司最近接手一个项目,需要写一个圆形旋转菜单,和菜单之间的移动换位支持,我本来以为这样的demo如若互联网是非常.想想你妈妈也帮不了我,空旋转,但它不能改变位置,所以LZ我们只能靠自己摸索. 最 ...

  8. 如何使用GDI绘制半透明矩形

    /*使用GDI绘制半透明矩形*/ void CDirectXDraw::DrawHalfOpacityRect(HDC hdc,CRect rect) { CDC dc; dc.Attach(hdc) ...

  9. Swift - 关于 Optional 的一点唠叨

    Optional 是 Swift 的一个非常重要的特性,它除了提供类型安全的机制,也是 Swift 中很多语言特性的核心.当然,使用 Optional 时也要了解很多坑,这样能帮助我们更好的运用它. ...

  10. Nginx之Eclipse开发环境配置

    C开发的IDE很多,为什么使用Eclipse?原因: 1. 历史原因:使用eclipse时间长,比较熟悉. 2. 功能原因:使用eclipse查看源码,可以在各个函数与头文件间直接跳转.这是所谓号称& ...