我想获取按它们在 Solr 索引中出现的次数排序的所有字段(即字段名称)的列表,即:最频繁出现的字段、第二频繁出现的字段等等。
或者,获取索引中的所有字段以及它们出现的次数也足够了。
如何使用单个 solr 查询或通过 solr/lucene java API 完成此操作?
字段集不是固定的,范围为数百个。几乎所有字段都是动态的,除了 id 可能还有更多。
如Solr 中所述:从 solr 索引中检索字段名称?你可以通过使用 LukeRequesthandler 来做到这一点。
为此,您需要在solrconfig.xml中启用 requestHandler
<requestHandler name="/admin/luke" class="org.apache.solr.handler.admin.LukeRequestHandler" />
并称之为
http://solr:8983/solr/admin/luke?numTerms=0
如果您想按某些内容对字段进行排序,您需要自己执行此操作。如果您在 java 环境中,我建议使用 Solrj。
使用 Solrj 获取字段
@Test
public void lukeRequest() throws SolrServerException, IOException {
SolrServer solrServer = new HttpSolrServer("http://solr:8983/solr");
LukeRequest lukeRequest = new LukeRequest();
lukeRequest.setNumTerms(1);
LukeResponse lukeResponse = lukeRequest.process(solrServer );
List<FieldInfo> sorted = new ArrayList<FieldInfo>(lukeResponse.getFieldInfo().values());
Collections.sort(sorted, new FieldInfoComparator());
for (FieldInfo infoEntry : sorted) {
System.out.println("name: " + infoEntry.getName());
System.out.println("docs: " + infoEntry.getDocs());
}
}
示例中使用的比较器
public class FieldInfoComparator implements Comparator<FieldInfo> {
@Override
public int compare(FieldInfo fieldInfo1, FieldInfo fieldInfo2) {
if (fieldInfo1.getDocs() > fieldInfo2.getDocs()) {
return -1;
}
if (fieldInfo1.getDocs() < fieldInfo2.getDocs()) {
return 1;
}
return fieldInfo1.getName().compareTo(fieldInfo2.getName());
}
}