[solr] - suggestion

前文使用了SpellCheck做了个自动完成模拟(Solr SpellCheck),使用第一种SpellCheck方式做auto-complete,是基于动态代码方式建立内容,下面方式可通过读文件方式建立内容,并有点击率排序。

1、在mycore/conf目录下新建一个dictionary.txt文件(UTF-8格式),内容为:

# sample dict
cpu intel I7    1.0
cpu AMD 5000+    2.0
中央处理器 英特尔    1.0
中央处理器 AMD    2.0
中央空调 海尔 1匹    1.0
中央空调 海尔 1.5匹    2.0
中央空调 海尔 2匹    3.0
中央空调 格力 1匹    4.0
中央空调 格力 1.5匹    5.0
中央空调 格力 2匹    6.0
中央空调 美的 1匹    7.0
中央空调 美的 1.5匹    8.0
中央空调 美的 2匹    9.0
中国中央政府    1.0
中国中央银行    2.0
中国中央人民银行    3.0
启信有限公司    1.0
启信科技有限公司    2.0

注意上面的“1.0、2.0、3.0”,这就是点击率。以Tab字符(\t)隔开与前面的文字,否则视为普通文本。

2、打开solrconfig.xml文件,加入节点到<config />当中:

    <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
      <lst name="spellchecker">
        <str name="name">file</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
        <!-- 下面这个field名字指的是拼写检查的依据,也就是说要根据哪个Field来检查用户输入。 -->
        <str name="field">content</str>
        <str name="combineWords">true</str>
        <str name="breakWords">true</str>
        <!-- 自动完成提示内容文件 -->
        <str name="sourceLocation">dictionary.txt</str>
        <!-- 自动完成提示索引目录,如果不写默认使用内存模式RAMDirectory -->
        <str name="spellcheckIndexDir">./spellchecker</str>
        <!-- 何时创建拼写索引:buildOnCommit/buildOnOptimize -->
        <str name="buildOnCommit">true</str>
      </lst>
    </searchComponent>
    <requestHandler name="/spellcheck" class="org.apache.solr.handler.component.SearchHandler">
      <lst name="defaults">
        <str name="spellcheck">true</str>
        <str name="spellcheck.dictionary">file</str>
        <!-- 提示查询的字符数量 -->
        <str name="spellcheck.count">20</str>
        <!-- 使用点击率排序 -->
        <str name="spellcheck.onlyMorePopular">true</str>
      </lst>
      <arr name="last-components">
        <str>spellcheck</str>
      </arr>
    </requestHandler>

在<searchComponent />中关键这句:

<str name="sourceLocation">dictionary.txt</str>

3、打开浏览器地址栏输入:

http://localhost:8899/solr/mycore/spellcheck?spellcheck.build=true

结果为:

4、在浏览器测试,输入地址:

http://localhost:8899/solr/mycore/spellcheck?q=中央&rows=0

5、使用代码测试:

package com.my.solr;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.SpellCheckResponse;
import org.apache.solr.client.solrj.response.SpellCheckResponse.Collation;
import org.apache.solr.client.solrj.response.SpellCheckResponse.Correction;
import org.apache.solr.client.solrj.response.SpellCheckResponse.Suggestion;

import com.my.entity.Item;

public class TestSolr {

    public static void main(String[] args) throws IOException, SolrServerException {
        String url = "http://localhost:8899/solr/mycore";
        HttpSolrServer core = new HttpSolrServer(url);
        core.setMaxRetries(1);
        core.setConnectionTimeout(5000);
        core.setParser(new XMLResponseParser()); // binary parser is used by default
        core.setSoTimeout(1000); // socket read timeout
        core.setDefaultMaxConnectionsPerHost(100);
        core.setMaxTotalConnections(100);
        core.setFollowRedirects(false); // defaults to false
        core.setAllowCompression(true);

        // ------------------------------------------------------
        // search
        // ------------------------------------------------------
        SolrQuery query = new SolrQuery();
        String token = "中央";
        query.set("qt", "/spellcheck");
        query.set("q", token);
        query.set("spellcheck", "on");
        query.set("spellcheck.build", "true");
        query.set("spellcheck.onlyMorePopular", "true");

        query.set("spellcheck.count", "100");
        query.set("spellcheck.alternativeTermCount", "4");
        query.set("spellcheck.onlyMorePopular", "true");

        query.set("spellcheck.extendedResults", "true");
        query.set("spellcheck.maxResultsForSuggest", "5");

        query.set("spellcheck.collate", "true");
        query.set("spellcheck.collateExtendedResults", "true");
        query.set("spellcheck.maxCollationTries", "5");
        query.set("spellcheck.maxCollations", "3");

        QueryResponse response = null;

        try {
            response = core.query(query);
            System.out.println("查询耗时:" + response.getQTime());
        } catch (SolrServerException e) {
            System.err.println(e.getMessage());
            e.printStackTrace();
        } catch (Exception e) {
            System.err.println(e.getMessage());
            e.printStackTrace();
        } finally {
            core.shutdown();
        }

        SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse();
        if (spellCheckResponse != null) {
            List<Suggestion> suggestionList = spellCheckResponse.getSuggestions();
            for (Suggestion suggestion : suggestionList) {
                System.out.println("Suggestions NumFound: " + suggestion.getNumFound());
                System.out.println("Token: " + suggestion.getToken());
                System.out.print("Suggested: ");
                List<String> suggestedWordList = suggestion.getAlternatives();
                for (String word : suggestedWordList) {
                    System.out.println(word + ", ");
                }
                System.out.println();
            }
            System.out.println();
            Map<String, Suggestion> suggestedMap = spellCheckResponse.getSuggestionMap();
            for (Map.Entry<String, Suggestion> entry : suggestedMap.entrySet()) {
                System.out.println("suggestionName: " + entry.getKey());
                Suggestion suggestion = entry.getValue();
                System.out.println("NumFound: " + suggestion.getNumFound());
                System.out.println("Token: " + suggestion.getToken());
                System.out.print("suggested: ");

                List<String> suggestedList = suggestion.getAlternatives();
                for (String suggestedWord : suggestedList) {
                    System.out.print(suggestedWord + ", ");
                }
                System.out.println("\n\n");
            }

            Suggestion suggestion = spellCheckResponse.getSuggestion(token);
            System.out.println("NumFound: " + suggestion.getNumFound());
            System.out.println("Token: " + suggestion.getToken());
            System.out.print("suggested: ");
            List<String> suggestedList = suggestion.getAlternatives();
            for (String suggestedWord : suggestedList) {
                System.out.print(suggestedWord + ", ");
            }
            System.out.println("\n\n");

            System.out.println("The First suggested word for solr is : " + spellCheckResponse.getFirstSuggestion(token));
            System.out.println("\n\n");

            List<Collation> collatedList = spellCheckResponse.getCollatedResults();
            if (collatedList != null) {
                for (Collation collation : collatedList) {
                    System.out.println("collated query String: " + collation.getCollationQueryString());
                    System.out.println("collation Num: " + collation.getNumberOfHits());
                    List<Correction> correctionList = collation.getMisspellingsAndCorrections();
                    for (Correction correction : correctionList) {
                        System.out.println("original: " + correction.getOriginal());
                        System.out.println("correction: " + correction.getCorrection());
                    }
                    System.out.println();
                }
            }
            System.out.println();
            System.out.println("The Collated word: " + spellCheckResponse.getCollatedResult());
            System.out.println();
        }

        System.out.println("查询耗时:" + response.getQTime());
    }
}

输出结果:

这里已经根据点击率排好序了。



上面dictionary.txt中有一个“启信”,这不是一个分词,所以如果查询“启”字,是不会有结果的。

加入用户自定义分词方法:

1、打开solr web的目录webapps\solr\WEB-INF\classes,新建一个etc.dic文本文件,内容:

启信

编辑IKAnalyzer.cfg.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典-->
    <entry key="ext_dict">ext.dic;</entry> 

    <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">stopword.dic;</entry> 

</properties>

保存,重启tomcat。

地址栏输入:

http://localhost:8899/solr/mycore/spellcheck?q=启&rows=0

结果:

使用代码方式亦同。

时间: 2024-08-29 10:43:47

[solr] - suggestion的相关文章

Solr 智能提示(suggest)

电商搜索中要实现这么一块功能,当输入文字时候,下拉框提示.类似于百度搜索 在师出名门的基于lucene的solr搜索引擎中.提供了 拼写检查和智能提示这块功能.   拼写检查就是用来检查用户输入的检索内容是否存在,如果不存在则,给它提示出相近,或相似的内容.   而检索建议则是用户输入某个检索条件后,会立刻友好的给出一系列提示内容,并推荐首个出现的相似的词,作为推荐词. 也就是说 拼写检查是可以作为一个单独功能使用,但suggest一般引用拼写检查组件 实现过程,配置solrconfig.xml

solr入门教程

Solr 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示.拼写检查.搜索建议.分组统计.拼音检索等功能的使用方法. 1. Solr 是什么? Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中.Solr 提供了层面搜索(就是统计).命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式).它易于安装和配置,而且附带了一个基于HT

Solr使用

import static org.junit.Assert.*; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache

Solr调研总结(转)

Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试.两个核心配置文件介绍.中文分词器配置.维护索引.查询索引,高亮显示.拼写检查.搜索建议.分组统计.自动聚类.相似匹配.拼音检索等功能的使用方法. 在代码文本框中如有显示不全的,请在文本框中按Ctrl+A再复制. 版本 作者/修改人 日期 V1.0 gzk 2013-06-04 1. Solr 是什么? Solr它是一种开放源码的.基于 Luce

[solr] - spell check

solr提供了一个spell check,又叫suggestions,可以用于查询输入的自动完成功能auto-complete. 参考文献: https://cwiki.apache.org/confluence/display/solr/Spell+Checking http://www.cnblogs.com/ibook360/archive/2011/11/30/2269077.html 方法: 修改core的solrconfig.xml 加入这段到<config />内 <sea

智能提示(一) Solr (suggest)

电商搜索中要实现这么一块功能,当输入文字时候.下拉框提示.类似于百度搜索 在师出名门的基于lucene的solr搜索引擎中.提供了 拼写检查和智能提示这块功能.   拼写检查就是用来检查用户输入的检索内容是否存在,假设不存在则,给它提示出相近,或相似的内容.   而检索建议则是用户输入某个检索条件后.会立马友好的给出一系列提示内容,并推荐首个出现的相似的词,作为推荐词. 也就是说 拼写检查是能够作为一个单独功能使用,但suggest一般引用拼写检查组件 实现过程.配置solrconfig.xml

Solr 6.1学习笔记 -- spellcheck 组件

<searchComponent name="spellcheck" class="solr.SpellCheckComponent"> <str name="queryAnalyzerFieldType">text_general</str> <!-- 下面的spellchecker使用了DirectSolrSpellChecker, 此类会使用主索引中的term进行拼写检查 --> <ls

java操作solr实现索引,查询,删除,拼写检查等功能

使用java操作solr 前面讲了很多对solr的操作都是直接在页面上操作的,实际工作中肯定是要使用java进行操作的,在这我们就看一下如何使用java来操作solr Solr提供了solrj来使用java操作solr,SolrJ是封装了httpClient方法,来操作solr的API的.首先添加maven依赖 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj<

solr教程,值得刚接触搜索开发人员一看

Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示.拼写检查.搜索建议.分组统计.拼音检索等功能的使用方法. 版本 作者/修改人 日期 V1.0 gzk 2013-06-04       1. Solr 是什么? Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中.Solr