Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SolrJ过滤查询排除_Java_Solr_Solrj_Faceted Search - Fatal编程技术网

Java 使用SolrJ过滤查询排除

Java 使用SolrJ过滤查询排除,java,solr,solrj,faceted-search,Java,Solr,Solrj,Faceted Search,我使用一个基于SolrJ的客户机来查询Solr,并且我一直在尝试构造排除方面名称/值对的HTTP请求。我正在使用的web界面具有进一步细化的功能,允许排除一个或多个方面值。我有3个方面字段:域、内容类型和作者,我希望能够通过排除每个字段来处理方面。例如,q=Dickens和fq=-author:Dickens,Janet将构造以下HTTP请求: /solr/solrbase/select?q=Dickens&fq=-author:Dickens%2c+Janet&wt=json&

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

/solr/solrbase/select?q=Dickens&fq=-author:Dickens%2c+Janet&wt=json&indent=true
而XML转储看起来像:

             <facets>
              <facet name="author">
                <facetEntry count="20">Dickens, Charles</facetEntry>
                <facetEntry count="10">Dickens, Sarah</facetEntry>
              </facet>
            </facets>
然而,这似乎是一种硬编码的方法,不能轻松地应用于所有3个方面和所有方面的值。我已经看过了,但仍然不清楚如何在当前代码中包含排除变量。你能帮忙吗

谢谢你

一,

编辑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<FacetField> facets = rsp.getFacetFields();
            if (facets != null) {
                int i = 0;
                for (FacetField facet : facets) {
                    Element sfacet = new Element("facet");
                    sfacet.setAttribute("name", facet.getName());

                    List<Count> 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;
    }
该模板仅具有
作者
方面,但我总共有3个方面。应该注意的是,我的web应用程序具有以下排除方面的语法:

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部分。但查询的其余部分可以正常工作


希望这会有所帮助。

您想根据需要排除
fq
,对吗?你能控制参数到查询的传递吗?是的,这正是我想要做的!如何将参数传递给查询?哪里你能举个例子吗?请参阅我的附加编辑,其中显示了模板面。谢谢你的帮助。很抱歉没有及时回复,但我已经离开了。我无法像您的示例中那样传递正确的参数。您是否建议使用类似solrQuery.set(CommonParams.FQ)的东西?谢谢你!
AND NOT facet_author:("Dickens, Janet")
SolrQuery solrQuery = new SolrQuery();
solrQuery.set(CommonParams.FQ, “-author:Dickens,Janet”);
/solr/solrbase/select?q=Dickens&fq=&wt=json&indent=true