1. <searchComponent name="suggest" class="solr.SuggestComponent">
  2. <lst name="suggester">
  3. <str name="name">AnalyzingSuggester</str>
  4. <str name="lookupImpl">AnalyzingLookupFactory</str>
  5. <str name="dictionaryImpl">DocumentDictionaryFactory</str>
  6. <str name="field">suggest_name</str>
  7. <str name="weightField">suggest_name</str>
  8. <str name="payloadField">gid</str>
  9. <str name="suggestAnalyzerFieldType">text_suggest</str>
  10. <str name="buildOnStartup">false</str>
  11. <str name="buildOnCommit">true</str>
  12. </lst>
  13. <lst name="suggester">
  14. <str name="name">AnalyzingInfixSuggester</str>
  15. <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
  16. <str name="dictionaryImpl">DocumentDictionaryFactory</str>
  17. <str name="field">suggest_name</str>
  18. <str name="weightField">suggest_name</str>
  19. <str name="highlight">false</str>
  20. <str name="payloadField">gid</str>
  21. <str name="suggestAnalyzerFieldType">text_suggest</str>
  22. <str name="buildOnStartup">false</str>
  23. <str name="buildOnCommit">true</str>
  24. </lst>
  25. </searchComponent>
  • 设置AnalyzingLookupFactory和AnalyzingInfixLookupFactory两种查找算法。首先通过AnalyzingLookupFactory先分析传入文本并将分析后的表单添加到加权FST的查找,然后在查找时执行相同的操作,若查找不够你需求的数量。再通过AnalyzingInfixLookupFactory前缀分析。
  • 例如 AnalyzingInfixLookupFactory “aaa bbb ccc”,可通过bbb,或者ccc搜索到,而 AnalyzingLookupFactory必须是先从a开始匹配才能出结果。
  • AnalyzingInfixLookupFactory可通过标签false关闭高亮提示。
  • true可通过此标签设置软提交时才进行文本构建。注意此种需求需要在提交文本不频繁的场景设置。
  • 配置在自己core下的conf文件夹中的solrconfig.xml文件
  1. vim solrconfig.xml
  1. <autoSoftCommit>
  2. <maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime>
  3. </autoSoftCommit>

将maxTime可以设置成你需要的时间,单位是毫秒ms.

  • 也可以在solr启动的时候通过命令设置软提交:
  1. bin/solr start -force -Dsolr.autoSoftCommit.maxTime=10000

设置了软提交时间后,当有新的文档提交时,会达到设置的软提交时间才真正提交。

在建立索引的时候,fileType定义的字段可不加入停用词过滤器,因为我们要检索的词很短,加入会影响检索结果。

  1. <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />

加入suggest.build=true这个条件,每输入一个字符检索的时候都会去重新构建suggest索引,检索效率大大减低。通过上面的软提交方式达到近实时检索。

  1. /**
  2. * @author monkjavaer
  3. * @version V1.0
  4. * @date 2019/6/21 0021 22:42
  5. */
  6. public class SolJTest {
  7. /**
  8. * 日志
  9. */
  10. private static Logger logger = LoggerFactory.getLogger(SolJTest.class);
  11. /**
  12. * solr 地址
  13. */
  14. private static String SOLR_URL = PropertyReaderUtils.getProValue("solr.address_url");
  15. /**
  16. * suggest AnalyzingLookupFactory
  17. */
  18. public final static String SOLR_ANALYZINGSUGGESTER = PropertyReaderUtils.getProValue("solr.AnalyzingSuggester");
  19. /**
  20. * suggest AnalyzingInfixLookupFactory
  21. */
  22. public final static String SOLR_ANALYZINGINFIXSUGGESTER = PropertyReaderUtils.getProValue("solr.AnalyzingInfixSuggester");
  23. /**
  24. * HttpSolrClient
  25. */
  26. private HttpSolrClient httpSolrClient;
  27. /**
  28. * default socket connection timeout in ms
  29. */
  30. private static int DEFAULT_CONNECTION_TIMEOUT = 60000;
  31. /**
  32. * @return void
  33. * @author monkjavaer
  34. * @description get HttpSolrClient
  35. * @date 13:27 2019/6/19
  36. * @param: []
  37. **/
  38. @Before
  39. public void getHttpSolrClient() {
  40. logger.info("start getHttpSolrClient......");
  41. try {
  42. if (httpSolrClient == null) {
  43. httpSolrClient = new HttpSolrClient.Builder(SOLR_URL).build();
  44. httpSolrClient.setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT);
  45. httpSolrClient.setDefaultMaxConnectionsPerHost(100);
  46. httpSolrClient.setMaxTotalConnections(100);
  47. }
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. logger.error(e.getMessage());
  51. }
  52. logger.info("end getHttpSolrClient......");
  53. }
  54. /**
  55. * @return void
  56. * @author monkjavaer
  57. * @description test suggester response object
  58. * @date 13:27 2019/6/19
  59. * @param: []
  60. **/
  61. @Test
  62. public void testSuggesterResponseObject() throws IOException, SolrServerException {
  63. SolrQuery query = new SolrQuery("*:*");
  64. query.set(CommonParams.QT, "/suggest");
  65. query.set("suggest.dictionary", SOLR_ANALYZINGSUGGESTER, SOLR_ANALYZINGINFIXSUGGESTER);
  66. query.set("suggest.q", "aoa");
  67. query.set("suggest.build", true);
  68. QueryRequest request = new QueryRequest(query);
  69. QueryResponse queryResponse = request.process(httpSolrClient);
  70. SuggesterResponse response = queryResponse.getSuggesterResponse();
  71. Map<String, List<Suggestion>> suggestionsMap = response.getSuggestions();
  72. assertTrue(suggestionsMap.keySet().contains(SOLR_ANALYZINGSUGGESTER));
  73. List<Suggestion> mySuggester = suggestionsMap.get(SOLR_ANALYZINGSUGGESTER);
  74. logger.info(mySuggester.get(0).getTerm());
  75. logger.info(mySuggester.get(0).getPayload());
  76. }
  77. /**
  78. * @return void
  79. * @author monkjavaer
  80. * @description test suggester response terms
  81. * @date 13:27 2019/6/19
  82. * @param: []
  83. **/
  84. @Test
  85. public void testSuggesterResponseTerms() throws Exception {
  86. SolrQuery query = new SolrQuery("*:*");
  87. query.set(CommonParams.QT, "/suggest");
  88. query.set("suggest.dictionary", SOLR_ANALYZINGSUGGESTER, SOLR_ANALYZINGINFIXSUGGESTER);
  89. query.set("suggest.q", "aoa");
  90. // query.set("suggest.build", true);
  91. QueryRequest request = new QueryRequest(query);
  92. QueryResponse queryResponse = request.process(httpSolrClient);
  93. SuggesterResponse response = queryResponse.getSuggesterResponse();
  94. Map<String, List<String>> dictionary2suggestions = response.getSuggestedTerms();
  95. assertTrue(dictionary2suggestions.keySet().contains(SOLR_ANALYZINGSUGGESTER));
  96. List<String> mySuggester = dictionary2suggestions.get(SOLR_ANALYZINGSUGGESTER);
  97. assertEquals("aoa", mySuggester.get(0));
  98. assertEquals("aoa bob", mySuggester.get(1));
  99. }
  100. /**
  101. * @return void
  102. * @author monkjavaer
  103. * @description 简单查询自动转换为bean
  104. * @date 13:27 2019/6/19
  105. * @param: []
  106. **/
  107. @Test
  108. public void testSolrQueryGetBeans() throws IOException, SolrServerException {
  109. final SolrQuery query = new SolrQuery();
  110. query.setQuery("Zhong Hua Yuan");
  111. //设置查询列
  112. query.addField("id");
  113. query.addField("name");
  114. //排序
  115. query.setSort("id", SolrQuery.ORDER.asc);
  116. final QueryResponse response = httpSolrClient.query("adress", query);
  117. final List<Adress> adresses = response.getBeans(Adress.class);
  118. logger.info("Found " + adresses.size() + " documents");
  119. for (Adress adress : adresses) {
  120. logger.info("id:{} ; name:{}; ", adress.getId(), adress.getName());
  121. }
  122. }
  123. /**
  124. * @return void
  125. * @author monkjavaer
  126. * @description 批量添加
  127. * @date 13:27 2019/6/19
  128. * @param: []
  129. **/
  130. @Test
  131. public void testAddIndex() throws IOException, SolrServerException {
  132. List<Adress> lists = new ArrayList<>();
  133. Adress adress = new Adress();
  134. adress.setId(1);
  135. adress.setName("aoa");
  136. lists.add(adress);
  137. //向solr批量添加索引数据
  138. long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
  139. httpSolrClient.addBeans(lists);
  140. httpSolrClient.commit();
  141. long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
  142. logger.info("commit solr data cost {} ms.", endTime - startTime);
  143. }
  144. }

版权声明:本文为monkjavaer原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/monkjavaer/p/11098770.html