Java 自定义QueryResponseWriter在solr 7.3.0中不工作
我以taming textbook为例,在solr中添加自定义Java 自定义QueryResponseWriter在solr 7.3.0中不工作,java,solr,Java,Solr,我以taming textbook为例,在solr中添加自定义QueryResponseWriter。但是它在wt中没有显示为tah 当我点击下面的查询时,将显示空响应 http://localhost:8983/solr/collectiona/type-ahead?q=fayes&wt=tah 在我的solr配置中,我已经放置了lib的以下dir路径 <lib dir="${solr.install.dir:../../../..}/contrib/customrespons
QueryResponseWriter
。但是它在wt
中没有显示为tah
当我点击下面的查询时,将显示空响应
http://localhost:8983/solr/collectiona/type-ahead?q=fayes&wt=tah
在我的solr配置中,我已经放置了lib的以下dir路径
<lib dir="${solr.install.dir:../../../..}/contrib/customresponsewriter" regex=".*\.jar" />
我已经为这本书中提到的内容创建了一个jar文件。这是我的java类
public class TypeAheadResponseWriter implements QueryResponseWriter {
private Set<String> fields;
public void write(Writer writer, SolrQueryRequest solrQueryRequest, SolrQueryResponse solrQueryResponse) throws IOException {
SolrIndexSearcher searcher = solrQueryRequest.getSearcher();
NamedList namedList = solrQueryResponse.getValues();
int size = namedList.size();
for (int i = 0; i < size; i++) {
Object val = namedList.getVal(i);
if (val instanceof DocList) {
DocList docList = (DocList) val;
DocIterator docIterator = docList.iterator();
writer.append("<ul>\n");
while (docIterator.hasNext()) {
int id = docIterator.nextDoc();
Document doc = searcher.doc(id, fields);
String name = doc.get("title");
writer.append("<li>" + name + "</li>");
}
writer.append("</ul>\n");
}
}
}
public String getContentType(SolrQueryRequest solrQueryRequest, SolrQueryResponse solrQueryResponse) {
return "text/html;charset=UTF-8";
}
public void init(NamedList namedList) {
fields = new HashSet<String>();
fields.add("title");
}
}
公共类TypeAheadResponseWriter实现QueryResponseWriter{
私有集合字段;
公共void write(Writer-Writer、SolrQueryRequest-SolrQueryRequest、SolrQueryResponse-SolrQueryResponse)引发IOException{
solrindexearcher searcher=solrQueryRequest.getSearcher();
NamedList NamedList=solrQueryResponse.getValues();
int size=namedList.size();
对于(int i=0;i\n”);
while(docIterator.hasNext()){
int id=docIterator.nextDoc();
文档文档=searcher.doc(id,字段);
字符串名称=doc.get(“title”);
writer.append(“”+name+” ”);
}
writer.append(“\n”);
}
}
}
公共字符串getContentType(SolrQueryRequest SolrQueryRequest,SolrQueryResponse SolrQueryResponse){
返回“text/html;charset=UTF-8”;
}
public void init(NamedList NamedList){
字段=新的HashSet();
字段。添加(“标题”);
}
}
这是我的queryResponsewriter的solr配置
<queryResponseWriter name="tah" class="cqw.TypeAheadResponseWriter"/>
<requestHandler name="/type-ahead" class="solr.SearchHandler">
<lst name="defaults">
<str name="wt">tah</str>
<str name="defType">dismax</str>
<str name="qf">title_prefix_typeahead^1.0</str>
</lst>
</requestHandler>
塔赫
沮丧
title\u prefix\u typeahead ^1.0
自定义库在solr启动期间加载,这是我的solr日志
从以下路径向类加载器添加了63个lib:[/home/bibek/software/java/solr-7.3.0/contrib/clustering/lib,/home/bibek/software/java/solr-7.3.0/contrib/customresponsewriter,/home/bibek/software/java/solr-7.3.0/contrib/extraction/lib,/home/bibek/software/java/solr-7.3.0/contrib/java/solr-7.3.0/dist]
在solr core 7.3中,
NameList::getVal(index)
将返回BasicResultContext
,它将包含DocList
实例的内容。下面是我更改的代码,供将来参考
public void write(Writer writer, SolrQueryRequest solrQueryRequest, SolrQueryResponse solrQueryResponse) throws IOException {
LOGGER.info("Here we are....");
SolrIndexSearcher searcher = solrQueryRequest.getSearcher();
NamedList namedList = solrQueryResponse.getValues();
LOGGER.info("Named List " + namedList.size());
int size = namedList.size();
for (int i = 0; i < size; i++) {
Object val = namedList.getVal(i);
LOGGER.info(val.toString());
if (val instanceof BasicResultContext) {
BasicResultContext basicResultContext = (BasicResultContext) val;
DocList docList = basicResultContext.getDocList();
LOGGER.info("docList List " + docList.size());
DocIterator docIterator = docList.iterator();
writer.append("<ul>\n");
while (docIterator.hasNext()) {
int id = docIterator.nextDoc();
LOGGER.info("id id " + id);
Document doc = searcher.doc(id, fields);
for (String field : fields) {
String value = doc.get(field);
LOGGER.info(value);
if (!StringUtils.isEmpty(value)) {
writer.append("<li>" + value + "</li>");
}
}
}
writer.append("</ul>\n");
}
}
}
public void write(Writer-Writer、SolrQueryRequest-SolrQueryRequest、SolrQueryResponse-SolrQueryResponse)引发IOException{
LOGGER.info(“我们到了……”);
solrindexearcher searcher=solrQueryRequest.getSearcher();
NamedList NamedList=solrQueryResponse.getValues();
LOGGER.info(“命名列表”+namedList.size());
int size=namedList.size();
对于(int i=0;i\n”);
while(docIterator.hasNext()){
int id=docIterator.nextDoc();
LOGGER.info(“id”+id);
文档文档=searcher.doc(id,字段);
用于(字符串字段:字段){
字符串值=单据获取(字段);
LOGGER.info(值);
如果(!StringUtils.isEmpty(值)){
writer.append(“”+value+“ ”);
}
}
}
writer.append(“\n”);
}
}
}
在solr core 7.3NameList::getVal(index)
中,将返回BasicResultContext
,其中将包含DocList
实例。下面是我更改的代码,供将来参考
public void write(Writer writer, SolrQueryRequest solrQueryRequest, SolrQueryResponse solrQueryResponse) throws IOException {
LOGGER.info("Here we are....");
SolrIndexSearcher searcher = solrQueryRequest.getSearcher();
NamedList namedList = solrQueryResponse.getValues();
LOGGER.info("Named List " + namedList.size());
int size = namedList.size();
for (int i = 0; i < size; i++) {
Object val = namedList.getVal(i);
LOGGER.info(val.toString());
if (val instanceof BasicResultContext) {
BasicResultContext basicResultContext = (BasicResultContext) val;
DocList docList = basicResultContext.getDocList();
LOGGER.info("docList List " + docList.size());
DocIterator docIterator = docList.iterator();
writer.append("<ul>\n");
while (docIterator.hasNext()) {
int id = docIterator.nextDoc();
LOGGER.info("id id " + id);
Document doc = searcher.doc(id, fields);
for (String field : fields) {
String value = doc.get(field);
LOGGER.info(value);
if (!StringUtils.isEmpty(value)) {
writer.append("<li>" + value + "</li>");
}
}
}
writer.append("</ul>\n");
}
}
}
public void write(Writer-Writer、SolrQueryRequest-SolrQueryRequest、SolrQueryResponse-SolrQueryResponse)引发IOException{
LOGGER.info(“我们到了……”);
solrindexearcher searcher=solrQueryRequest.getSearcher();
NamedList NamedList=solrQueryResponse.getValues();
LOGGER.info(“命名列表”+namedList.size());
int size=namedList.size();
对于(int i=0;i\n”);
while(docIterator.hasNext()){
int id=docIterator.nextDoc();
LOGGER.info(“id”+id);
文档文档=searcher.doc(id,字段);
用于(字符串字段:字段){
字符串值=单据获取(字段);
LOGGER.info(值);
如果(!StringUtils.isEmpty(值)){
writer.append(“”+value+“ ”);
}
}
}
writer.append(“\n”);
}
}
}
那么您是如何启用配置的呢?如果您使用的是集合,听起来像是在云模式下运行Solr-在这种情况下,您必须在嵌入式zookeeper实例中上载和更新配置。@MatsLindh我使用的是Solr core,我有配置