我正在尝试使用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时,它确实得到了响应。我尽我所能尝试了一切。不知道我哪里出错了。
答案 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