Solr:如何从Solr索引中检索字段名称?

26

我如何查询Solr实例中所有(或以指定前缀开头的)字段名呢?

我想要使用动态字段,而我不知道可能有多少个,例如:category_0_scategory_1_s等。

最好能够使用前缀,例如:category_

3个回答

51

这个查询将返回一个逗号分隔的列表,其中包括所有正在使用的字段,包括动态字段。

select?q=*:*&wt=csv&rows=0&facet
回答原问题,以下是如何获取以 category_ 开头的所有字段的列表。
select?q=*:*&wt=csv&rows=0&facet&fl=category_*

在较新版本的Solr上,需要使用facet参数使此查询起作用。 在旧版本上,没有该参数也可以工作。

在旧版本中,fl参数中的通配符将无法正常工作。


2
在Solr5中,包括facetfacet.field会导致400 Bad Request错误,但仍然包括字段。省略facet.field将返回字段和200 Success。 - Izkata
@Izkata 感谢您的改进!我已经更新了我的答案。奇怪的是,设置 facet=true 不起作用,但是没有值的 facet 起作用。 - GoalBased
仅在Solr 6.3上,fl=id、category...才能在不带facet=on的情况下正常工作。我想知道是否仍需要在模式中添加其他内容以显示附加信息。 - Gadelkareem
2
奇怪,为什么只有csv格式返回才能正常工作?我为什么不能得到JSON格式的返回呢?(我是Solr新手) - K.-Michael Aye
1
@K.-MichaelAye 因为 JSON 没有列标题。通过请求 0 行,这只会返回 CSV 列标题。这是邪恶的天才之举。 - James M

25

使用卢克处理器:

http://solr:8983/solr/admin/luke?numTerms=0
使用xpath获取所有具有dynamicBase标记的字段,以匹配您正在查找的动态字段定义。

@Philippe 这样做无法获取所有正在使用的动态字段的名称,这正是原帖作者所要求的。请仔细阅读问题和答案。 - GoalBased
@GoalBased 好的,但是如果你提供了更好的解决方案而不是批评,那也会有所帮助。所以为了更新我的“答案”,动态字段的正确调用是 http://host:<port>/solr/collection/schema/dynamicfields。更多选项请参见 https://cwiki.apache.org/confluence/display/solr/Schema+API。 - Philippe
我在下面发布了一个答案,不需要卢克。 - GoalBased
我该如何获取使用此术语的所有字段列表,并仍然在同一查询中应用fq? - Krunal

1
如果您需要在Java应用程序中执行此操作,可以使用SolrjLukeRequestRequestHandler
您的代码应该如下所示。
LukeRequest lukeRequest = new LukeRequest();
lukeRequest.setNumTerms(0);

LukeResponse lukeResponse = lukeRequest.process(server);

Map<String, FieldInfo> fieldInfoMap = lukeResponse.getFieldInfo();

for (Entry<String, FieldInfo> entry : fieldInfoMap.entrySet()) {

    String fieldName = entry.getKey();
    FieldInfo fieldInfo = entry.getValue();

    // process fieldInfo    
}

facet 是从哪里来的? - tar
抱歉,那是一个打字错误。已经修复了代码以有效地迭代哈希映射条目。希望这可以帮到你。 - cjungel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接