Solr Typeahead功能实现

时间:2013-11-28 21:11:05

标签: java web-applications solr typeahead

我正在尝试使用solr(索引核心名称为“people”)在我的搜索引擎中实现预先输入功能,并在我的solrconfig.xml中完成了以下配置更改:

<queryResponseWriter name="tah"
class="com.sample.TypeAheadResponseWriter"/>
<requestHandler name="/type-ahead"
    class="solr.SearchHandler">
    <lst name="defaults">
        <str name="wt">tah</str>
        <str name="defType">dismax</str>
        <str name="qf"> wordPrefix^1.0 </str>
    </lst>
</requestHandler>

我的架构文件字段

<field name="wordPrefix" type="prefix" />
<copyField source="name" dest="wordPrefix"/>

以下是我的com.sample.TypeAheadResponseWriter

的内容
public class TypeAheadResponseWriter implements QueryResponseWriter {
    private Set<String> fields;

    @Override
    public String getContentType(SolrQueryRequest req, SolrQueryResponse solrQueryResponse) {
        return "text/html;charset=UTF-8";
    }

    public void init(NamedList n) {
        fields = new HashSet<String>();
        fields.add("word");
    }

    @Override
    public void write(Writer w, SolrQueryRequest req, SolrQueryResponse rsp) throws IOException {
        SolrIndexSearcher searcher = req.getSearcher();
        NamedList nl = rsp.getValues();
        int sz = nl.size();
        for (int li = 0; li < sz; li++) {
            Object val = nl.getVal(li);
            if (val instanceof DocList) {
                DocList dl = (DocList) val;
                DocIterator iterator = dl.iterator();
                w.append("<ul>n");
                while (iterator.hasNext()) {
                    int id = iterator.nextDoc();
                    Document doc = searcher.doc(id, fields);
                    String name = doc.get("name");
                    w.append("<li>" + name + "</li>n");
                }
                w.append("</ul>n");
            }
        }
    }
}

但我没有得到任何关于点击网址的回复

http://<hostname>:8983/solr/people/type-ahead?q=Reb. 

但是当我在solrconfig.xml中将wt的值更改为json时,它确实得到了响应。我尽我所能尝试了一切。不知道我哪里出错了。

1 个答案:

答案 0 :(得分:0)

我想,麻烦在这里:

if (val instanceof DocList) {

让我们看一下QueryComponent.process的最后一行:

ResultContext ctx = new ResultContext();
ctx.docs = rb.getResults().docList;
ctx.query = rb.getQuery();
rsp.add("response", ctx);

因此DocList位于rsp.getValues().get("response").docs