java 查询solr_java – 使用SolrJ过滤查询排除

本文档描述了如何使用SolrJ在Java应用中构造Solr查询,特别是如何排除特定的过滤器查询。作者展示了如何处理多个方面的过滤,并提供了代码示例来构造和执行查询,以及解析和呈现查询结果。
摘要由CSDN通过智能技术生成

我使用基于SolrJ的客户端来查询Solr,我一直在尝试构造排除了facet名称/值对的HTTP请求.我正在使用的Web界面具有进一步细化的功能,允许排除一个或多个构面值.我有3个方面字段:域名,内容类型和作者,我希望能够通过排除每个字段来处理分面.例如,q = Dickens AND fq = -author:Dickens,Janet将构造以下HTTP请求:

/solr/solrbase/select?q=Dickens&fq=-author:Dickens%2c+Janet&wt=json&indent=true

而XML转储看起来像:

Dickens, Charles

Dickens, Sarah

到目前为止,我正在使用的Java实现似乎不处理过滤器查询排除:

private HttpSolrServer solrServer;

solrServer = new HttpSolrServer("http://localhost:8983/solr/");

private static final String CONFIG_SOLR_FACET_FIELD = "facet_field";

private String[] _facetFields = new String[] {"author"};

private static final String CONFIG_SOLR_FACETS = "facets"

Element el = myParams.getChild(CONFIG_SOLR_FACETS);

_facetUse = el.getAttributeValue("useFacets", "true");

_facetMinCount = el.getAttributeValue("minCount", String.valueOf(1));

_facetLimit = el.getAttributeValue("limit", String.valueOf(20));

List vals = el.getChildren(CONFIG_SOLR_FACET_FIELD);

if (vals.size() > 0) {

_facetFields = new String[vals.size()];

for (int i=0; i < vals.size(); i++) {

_facetFields[i] = ((Element)vals.get(i)).getTextTrim();

}

}

SolrQuery query = new SolrQuery();

query.setQuery(qs);

List facetList = doc.getRootElement().getChildren("facet");

Iterator it = facetList.iterator();

while (it.hasNext()) {

Element el = (Element)it.next(); //

String name = el.getAttributeValue("name");

String value = el.getTextTrim();

if (name != null && value != null) {

facets.add(name+":"+value);

}

}

query.setQuery(qs).

setFacet(Boolean.parseBoolean(_facetUse)).

setFacetMinCount(Integer.parseInt(_facetMinCount)).

setFacetLimit(Integer.parseInt(_facetLimit)).

for (int i=0; i<_facetfields.length i>

query.addFacetField(_facetFields[i]);

};

for (int i=0; i

query.addFilterQuery(facets.get(i));

};

return query;

}

我被建议使用这些方面的东西:

SolrQuery solrQuery = new SolrQuery();

solrQuery.set(CommonParams.FQ, “-author:Dickens,Janet”);

但是,这似乎是一种硬编码方法,并且不能轻易应用于所有3个方面和所有方面值.我已经查看了this,但我仍然不清楚如何在当前代码中包含排除变体.你能帮帮忙吗?

谢谢,

一世.

编辑1

我已经附加了代码来构造/准备Solr查询,但我还应该包括如何实际查询Solr实例:

private QueryResponse execQuery(SolrQuery query) throws SolrServerException {

QueryResponse rsp = solrServer.query( query );

return rsp;

}

此外,发布将facet的Solr查询响应转换为Web应用程序可以理解的内容的代码会很有帮助:

Element elfacets = new Element("facets");

List facets = rsp.getFacetFields();

if (facets != null) {

int i = 0;

for (FacetField facet : facets) {

Element sfacet = new Element("facet");

sfacet.setAttribute("name", facet.getName());

List facetEntries = facet.getValues();

for(FacetField.Count fcount : facetEntries) {

Element facetEntry = new Element("facetEntry");

facetEntry.setText(fcount.getName());

facetEntry.setAttribute("count", String.valueOf(fcount.getCount()));

sfacet.addContent(facetEntry);

}

elfacets.addContent(sfacet);

}

root.addContent(elfacets);

}

doc.addContent(root);

return doc;

}

“facets”只不过是XSLT,其中包含有关如何使用Web应用程序处理的facet映射Solr facet的规则.

编辑2

我附加了“facets”模板,该模板由编辑1中提供的代码调用:

该模板仅包含作者方面,但我总共有3个方面.应该注意,我的Web应用程序具有以下语法来排除facets:

AND NOT facet_author:("Dickens, Janet")

最佳答案 我确定你在某些方法中有以下几行.而不是硬编码fq部分,在那里有一些变量.

SolrQuery solrQuery = new SolrQuery();

solrQuery.set(CommonParams.FQ, “-author:Dickens,Janet”);

如果你需要使用fq,请传递适当的参数(例如“-author:Dickens,Janet”).否则传递一个空字符串.所以,你的查询就像

/solr/solrbase/select?q=Dickens&fq=&wt=json&indent=true

然后添加查询的构面部分.虽然你的查询有fq =,但它不会抛出错误.它基本上不适用于fq部分.但其余的查询将正常工作.

希望这会有所帮助.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值