转载:Solr的自动完成实现方式(第一部分:facet方式)

转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269059.html

大部分人已经见过自动完成(autocomplete)的功能了(见下图),solr提供了构建这个功能的机制。今天,我将给你展示如何使用facet的方式来添加自动完成机制。

 
索引 
设想你想在你的在线商店中,给用户一些提示,比如商品的名称。假设我们的索引构建如下:

<field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>  <field name="name" type="text" indexed="true" stored="true" multiValued="false" />  <field name="description" type="text" indexed="true" stored="true" multiValued="false" />  

text类型的定义为:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">  <analyzer>  <tokenizer class="solr.WhitespaceTokenizerFactory"/>  <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>  <filter class="solr.LowerCaseFilterFactory"/>  </analyzer>  </fieldType>  

配置 
开始前,首先考虑你要实现的功能:是要实现一个名字的提示,还是全名的提示。这都依赖于我们的选择,我们必须为需要引导的地方设置适当的域。

单词提示 
在单词的情况下,我们使用的域也即一个token。在这种情况下,域名为name就足够了。但是,这属于一个词干,analysis的操作都在词干上,因此,我们最好换一个其他的类型。

全名提示 
我们使用一个不同的域配置来定义全名提示--最好一个未被定义的域。但是我们不能使用基于类似string这种类型的域,基于这个原因,我们定义为一下的域:

<field name="name_auto" type="text_auto" indexed="true" stored="true" multiValued="false" />

text_auto类型的定义为:

<fieldType name="text_auto" class="solr.TextField">  <analyzer>  <tokenizer class="solr.KeywordTokenizerFactory"/>  <filter class="solr.LowerCaseFilterFactory"/>  </analyzer>  </fieldType>  

为了不影响原有数据的格式,将原数据进行拷贝:

<copyField source="name" dest="name_auto" />

如何使用 
为了使用这个数据,我们准备了一个简单的查询语句:

q=*:*&facet=true&facet.field=FIELD&facet.mincount=1&facet.prefix=USER_QUERY

需要替换的地方: 
   FIELD:我们打算提供建议的域,在本例中域名为name 或name_auto 
   USER_QUERY:用户输入的字符

这里可以设置rows=0,这样可以只返回facet的结果,而没有查询结果。当然这不是必须的。

查询的一个例子可以这样写:

fl=id,name&rows=0&q=*:*&facet=true&facet.field=name_auto&facet.mincount=1&facet.prefix=har

查询结果会返回这样的结果:

<response>  <lst name="responseHeader">  <int name="status">0</int>  <int name="QTime">0</int>  </lst>  <result name="response" numFound="4" start="0"/>  <lst name="facet_counts">  <lst name="facet_queries"/>  <lst name="facet_fields">  <lst name="name_auto">  <int name="hard disk">1</int>  <int name="hard disk samsung">1</int>  <int name="hard disk seagate">1</int>  <int name="hard disk toshiba">1</int>  </lst>  </lst>  <lst name="facet_dates"/></lst>  </response>  

时间: 2024-09-20 16:48:25

转载:Solr的自动完成实现方式(第一部分:facet方式)的相关文章

转载:Solr的自动完成实现方式(第二部分:Suggester方式)

转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269077.html 在Solr的自动完成/自动补充实现介绍(第一部分) 中我介绍了怎么用faceting的机制来实现自动完成(autocomplete)的功能,今天我们来看一下如何用Suggester的组件来实现自动完成功能. 开始  这里有一点需要提醒:Suggest组件在1.4.1或以下版本不可用.要使用这个组件,你需要下载3_x或lucene/solr的主干版本. 配置 在索引

(转载)solr实现满足指定距离范围条件的搜索

配置schema.xml <?xml version="1.0" encoding="UTF-8" ?> <schema name="aifang-loupan" version="1.1"> <types> <fieldType name="string" class="solr.StrField" sortMissingLast="

SM4算法及实现方式——第一部分

==国密算法的实现方式·第一部分== 一.SM4是什么 写在前面 这段时间的博客是作者本科毕业设计的周期性小报告,考虑到公开可浏览,故写成了这种略带密码学科普性的博客,在提交周期性工作汇报的同时分享一些学习密码学时的心得,欢迎大家批评指正. 本系列主要内容为SM2/3/4/9系列算法的简单介绍和python的实现方式,也可能有时会添加一些为其它同学做的小玩意,请相信作者都是字字手码,尽量让对密码学有兴趣的同学们都能看懂.python版本为3.6.6,有编程基础者约一周可上手,推荐小甲鱼系列丛书,

用POI导出excel时,较长的数字不想被自动变为科学计数法的解决方式(转)

做过很多次导出excel了.都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法... 弄过好几次都没有解决,最近又要导出excel了,下决心一定要找到解决办法 自己在excel里测试过,较长的数字,都会自动变成科学计数法,除非我们把单元格格式设置成“文本型” 哈哈,似乎找到了思路:用poi先把单元格设置成“文本型”就可以了把. 从文档里找到了这个方法HSSFCell.setCellType(int type),怎么看这个方法都

【转载】myeclipse自动生成注释

在使用Eclipse编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的,例如其中author 的属性值. 我们可以在Eclipse中进行设置自己希望显示的信息. 现在看看如何修改我们的用户名即作者信息:点击Windows->Preferences->Java->Code Style->Code Templates, 然后我们就可以选择右边窗口中的Comments,对应具体的comments选项,我们便可以对具体的注释信息进行编辑设置. 例如我们希望在一个Java文

Android的Frangment的第一种声明方式

Android的Frangment的第一种声明方式 实际效果图如下: 项目结构图如下: fragment1: package com.demo.fragementfirst; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nul

spring 四种依赖注入方式以及注解注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化, 而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员, 而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种依赖注

Hibernate的检索方式--查询数据的方式

Hibernate 提供了以下几种检索对象的方式1导航对象图检索方式: 根据已经加载的对象导航到其他对象(根据已经加载的对象,导航到其他对象-例如一对多的查询)2OID 检索方式: 按照对象的 OID 来检索对象(更具ID查询---find(Id).get(),load())3HQL 检索方式: 使用面向对象的 HQL 查询语言4QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接

1.tomcat部署项目的几种方式和weblogic部署方式及一点通讯

  第一种部署方式: 直接使用myeclipse 找到server服务 添加要部署的项目Add Deployment ,然后选中某个项目,首选Exploded Archive(development mode) ,然后finish,直接将javaweb项目部署到了 tomcat的webapp目录中,然后启动服务,就将项目挂载到了tomcat服务器中. 第二种部署方式: 找到tomcat所在目录,然后打开tomcat目录下的conf目录,然后找到Catalina目录,打开并找到locahost目录

git防止每次提交输入用户名与密码的方法(http方式 而不是 ssh方式)

windows下比较比较好用的git客户端有2种: 1. msysgit + TortoiseGit(乌龟git) 2. GitHub for Windows github的windows版也用过一段时间,但还是不太习惯.所以目前仍然青睐与msysgit+乌龟git的组合.TortoiseGit在提交时总数会提示你输入用户名密码,非常麻烦.解决方案如下: 方法一: 设置 -> git 编辑本地 .git/config 增加 1[credential] 2 helper = store保存,输入一