【搜索引擎】Solr全文检索近实时查询优化
设置多个搜索建议查找算法
<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_name</str>
<str name="weightField">suggest_name</str>
<str name="payloadField">gid</str>
<str name="suggestAnalyzerFieldType">text_suggest</str>
<str name="buildOnStartup">false</str>
<str name="buildOnCommit">true</str>
</lst>
<lst name="suggester">
<str name="name">AnalyzingInfixSuggester</str>
<str name="lookupImpl">AnalyzingInfixLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">suggest_name</str>
<str name="weightField">suggest_name</str>
<str name="highlight">false</str>
<str name="payloadField">gid</str>
<str name="suggestAnalyzerFieldType">text_suggest</str>
<str name="buildOnStartup">false</str>
<str name="buildOnCommit">true</str>
</lst>
</searchComponent>
- 设置AnalyzingLookupFactory和AnalyzingInfixLookupFactory两种查找算法。首先通过AnalyzingLookupFactory先分析传入文本并将分析后的表单添加到加权FST的查找,然后在查找时执行相同的操作,若查找不够你需求的数量。再通过AnalyzingInfixLookupFactory前缀分析。
- 例如 AnalyzingInfixLookupFactory "aaa bbb ccc",可通过bbb,或者ccc搜索到,而 AnalyzingLookupFactory必须是先从a开始匹配才能出结果。
- AnalyzingInfixLookupFactory可通过标签false关闭高亮提示。
- true可通过此标签设置软提交时才进行文本构建。注意此种需求需要在提交文本不频繁的场景设置。
设置软提交时间
- 配置在自己core下的conf文件夹中的solrconfig.xml文件
vim solrconfig.xml
<autoSoftCommit>
<maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime>
</autoSoftCommit>
将maxTime可以设置成你需要的时间,单位是毫秒ms.
- 也可以在solr启动的时候通过命令设置软提交:
bin/solr start -force -Dsolr.autoSoftCommit.maxTime=10000
设置了软提交时间后,当有新的文档提交时,会达到设置的软提交时间才真正提交。
关闭停用词过滤器
在建立索引的时候,fileType定义的字段可不加入停用词过滤器,因为我们要检索的词很短,加入会影响检索结果。
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
Java服务器调用suggest接口时,禁用suggest.build=true
加入suggest.build=true这个条件,每输入一个字符检索的时候都会去重新构建suggest索引,检索效率大大减低。通过上面的软提交方式达到近实时检索。
Java服务器测试用例
/**
* @author monkjavaer
* @version V1.0
* @date 2019/6/21 0021 22:42
*/
public class SolJTest {
/**
* 日志
*/
private static Logger logger = LoggerFactory.getLogger(SolJTest.class);
/**
* solr 地址
*/
private static String SOLR_URL = PropertyReaderUtils.getProValue("solr.address_url");
/**
* suggest AnalyzingLookupFactory
*/
public final static String SOLR_ANALYZINGSUGGESTER = PropertyReaderUtils.getProValue("solr.AnalyzingSuggester");
/**
* suggest AnalyzingInfixLookupFactory
*/
public final static String SOLR_ANALYZINGINFIXSUGGESTER = PropertyReaderUtils.getProValue("solr.AnalyzingInfixSuggester");
/**
* HttpSolrClient
*/
private HttpSolrClient httpSolrClient;
/**
* default socket connection timeout in ms
*/
private static int DEFAULT_CONNECTION_TIMEOUT = 60000;
/**
* @return void
* @author monkjavaer
* @description get HttpSolrClient
* @date 13:27 2019/6/19
* @param: []
**/
@Before
public void getHttpSolrClient() {
logger.info("start getHttpSolrClient......");
try {
if (httpSolrClient == null) {
httpSolrClient = new HttpSolrClient.Builder(SOLR_URL).build();
httpSolrClient.setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT);
httpSolrClient.setDefaultMaxConnectionsPerHost(100);
httpSolrClient.setMaxTotalConnections(100);
}
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage());
}
logger.info("end getHttpSolrClient......");
}
/**
* @return void
* @author monkjavaer
* @description test suggester response object
* @date 13:27 2019/6/19
* @param: []
**/
@Test
public void testSuggesterResponseObject() throws IOException, SolrServerException {
SolrQuery query = new SolrQuery("*:*");
query.set(CommonParams.QT, "/suggest");
query.set("suggest.dictionary", SOLR_ANALYZINGSUGGESTER, SOLR_ANALYZINGINFIXSUGGESTER);
query.set("suggest.q", "aoa");
query.set("suggest.build", true);
QueryRequest request = new QueryRequest(query);
QueryResponse queryResponse = request.process(httpSolrClient);
SuggesterResponse response = queryResponse.getSuggesterResponse();
Map<String, List<Suggestion>> suggestionsMap = response.getSuggestions();
assertTrue(suggestionsMap.keySet().contains(SOLR_ANALYZINGSUGGESTER));
List<Suggestion> mySuggester = suggestionsMap.get(SOLR_ANALYZINGSUGGESTER);
logger.info(mySuggester.get(0).getTerm());
logger.info(mySuggester.get(0).getPayload());
}
/**
* @return void
* @author monkjavaer
* @description test suggester response terms
* @date 13:27 2019/6/19
* @param: []
**/
@Test
public void testSuggesterResponseTerms() throws Exception {
SolrQuery query = new SolrQuery("*:*");
query.set(CommonParams.QT, "/suggest");
query.set("suggest.dictionary", SOLR_ANALYZINGSUGGESTER, SOLR_ANALYZINGINFIXSUGGESTER);
query.set("suggest.q", "aoa");
// query.set("suggest.build", true);
QueryRequest request = new QueryRequest(query);
QueryResponse queryResponse = request.process(httpSolrClient);
SuggesterResponse response = queryResponse.getSuggesterResponse();
Map<String, List<String>> dictionary2suggestions = response.getSuggestedTerms();
assertTrue(dictionary2suggestions.keySet().contains(SOLR_ANALYZINGSUGGESTER));
List<String> mySuggester = dictionary2suggestions.get(SOLR_ANALYZINGSUGGESTER);
assertEquals("aoa", mySuggester.get(0));
assertEquals("aoa bob", mySuggester.get(1));
}
/**
* @return void
* @author monkjavaer
* @description 简单查询自动转换为bean
* @date 13:27 2019/6/19
* @param: []
**/
@Test
public void testSolrQueryGetBeans() throws IOException, SolrServerException {
final SolrQuery query = new SolrQuery();
query.setQuery("Zhong Hua Yuan");
//设置查询列
query.addField("id");
query.addField("name");
//排序
query.setSort("id", SolrQuery.ORDER.asc);
final QueryResponse response = httpSolrClient.query("adress", query);
final List<Adress> adresses = response.getBeans(Adress.class);
logger.info("Found " + adresses.size() + " documents");
for (Adress adress : adresses) {
logger.info("id:{} ; name:{}; ", adress.getId(), adress.getName());
}
}
/**
* @return void
* @author monkjavaer
* @description 批量添加
* @date 13:27 2019/6/19
* @param: []
**/
@Test
public void testAddIndex() throws IOException, SolrServerException {
List<Adress> lists = new ArrayList<>();
Adress adress = new Adress();
adress.setId(1);
adress.setName("aoa");
lists.add(adress);
//向solr批量添加索引数据
long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
httpSolrClient.addBeans(lists);
httpSolrClient.commit();
long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
logger.info("commit solr data cost {} ms.", endTime - startTime);
}
}
【搜索引擎】Solr全文检索近实时查询优化的更多相关文章
- solr 近实时搜索
摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到. Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merg ...
- SOLR (全文检索)
SOLR (全文检索) http://sinykk.iteye.com/ 1. 什么是SOLR 官方网站 http://wiki.apache.org/solr http://wiki.apach ...
- sphinx通过增量索引实现近实时更新
一.sphinx增量索引实现近实时更新设置 数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少. 例如.原来的数据 ...
- 剖析Elasticsearch集群系列之三:近实时搜索、深层分页问题和搜索相关性权衡之道
转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03 近实时搜索 虽然Elasticsearch ...
- 一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询
这两天加班,不能兼顾博客的更新.请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容.而我们又想像数据库那样能直接体如今查询中.这里就是我们所说的增量索引.对于这种需求我们怎么来实现呢?lu ...
- Lucene.net 实现近实时搜索(NRT)和增量索引
Lucene做站内搜索的时候经常会遇到实时搜索的应用场景,比如用户搜索的功能.实现实时搜索,最普通的做法是,添加新的document之后,调用 IndexWriter 的 Commit 方法把内存中的 ...
- Lucene系列-近实时搜索(1)
近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...
- lucene4.5近实时搜索
近实时搜索就是他能打开一个IndexWriter快速搜索索引变更的内容,而不必关闭writer,或者向writer提交,这个功能是在2.9版本以后引入的,在以前没有这个功能时,必须调用writer的c ...
- 【Lucene】近实时搜索
近实时搜索:可以使用一个打开的IndexWriter快速搜索索引的变更内容,而不必首先关闭writer,或者向该writer提交:这是2.9版本之后推出的新功能. 代码示例(本例参考<Lucen ...
随机推荐
- Java--分布式系统高并发解决方案
对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研 ...
- go语言刷leetcode - 14 Longest Common Prefix
func longestCommonPrefix(strs []string) string { { return "" } { ] } ; ; idx++ { ; i < ...
- Android Studio右键选项中没有Git?
从Git clone一个Project并打开后,都会习惯性的像使用Eclipse一样,选中project右键,选择Git的相应版本号控制选项. 例如以下图,你仅仅看到了svn. 怎样配置才干在右键选项 ...
- C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码
原文:C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码 C#WPF 如何绘制几何图形? 怎么绘制坐标系?绘制sin曲线(正弦曲线)? 这离不开Path(Syst ...
- FastDFS是纯C语言实现,只支持Linux,适合以中小文件为载体的在线服务,还可以冗余备份和负载均衡
一.理论基础 FastDFS比较适合以中小文件为载体的在线服务,比如跟NGINX(APACHE)配合搭建图片服务器. 分布式文件系统FastDFS FastDFS是纯C语言实现,只支持Linux.Fr ...
- leetcode先刷_Pascal's Triangle II
三角相对简答题.第一个问题是太简单.我不沾了,我一定会写.其实没什么的第二个问题,与这个问题计算路径有点像一个三角形,假定输入是n,然后从第一行计数到第一n行,保存在数据线上的时间到,由于只有相关的事 ...
- uva 11346 - Probability(可能性)
题目链接:uva 11346 - Probability 题目大意:给定x,y的范围.以及s,问说在该范围内选取一点,和x,y轴形成图形的面积大于s的概率. 解题思路:首先达到方程xy ≥ s.即y ...
- HDU-3839-Ancient Messages(DFS)
Problem Description In order to understand early civilizations, archaeologists often study texts wri ...
- 关于 IIS 上运行 ASP.NET Core 站点的“HTTP 错误 500.19”错误
昨天回答了博问中的一个问题 —— “HTTP 错误 500.19 - Internal Server Error dotnetcore”,今天在这篇随笔中时候事后诸葛亮地小结一下. 服务器是 Wind ...
- 如何清除XP的网络共享密码
一.利用NET命令 我们知道在Windows XP中提供了“net user”命令,该命令可以添加.修改用户账户信息,其语法格式为: net user [UserName [Password | *] ...