簡體   English   中英

使用SolrJ過濾查詢排除

[英]Filter query exclusion with SolrJ

我使用基於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轉儲看起來像:

             <facets>
              <facet name="author">
                <facetEntry count="20">Dickens, Charles</facetEntry>
                <facetEntry count="10">Dickens, Sarah</facetEntry>
              </facet>
            </facets>

到目前為止,我正在使用的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<String> 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<facets.size(); i++) {
            query.addFilterQuery(facets.get(i));
        };
  return query;

    }

我被建議使用這些方面的東西:

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

但是,這似乎是一種硬編碼方法,並且不能輕易應用於所有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;
    }

"facets"只不過是XSLT,其中包含有關如何使用Web應用程序處理的facet映射Solr facet的規則。

編輯2我附加了"facets"模板,該模板由編輯1中顯示的代碼調用:

<xsl:template name="facets">
                <xsl:param name="q" />
                <xsl:analyze-string select="$q" regex='AND facet_(.*?):\(("?.*?"?)\)'>
                        <xsl:matching-substring>
                        <xsl:choose>
                        <xsl:when test="regex-group(1) = 'author'">
                                    <facet name="author"><xsl:value-of select="regex-group(2)" /></facet>
                        </xsl:when>    
                        </xsl:choose>
                        </xsl:matching-substring>
                       <xsl:non-matching-substring>
                       <!--<xsl:analyze-string select="$q" regex='AND NOT facet_(.*?):\(("?.*?"?)\)'>
                       <xsl:matching-substring>
                       <xsl:choose>
                       <xsl:when test="regex-group(1) = 'author'">
                                    <facet name="author"><xsl:value-of select="regex-group(2)" /></facet>
                        </xsl:when>   
                        </xsl:choose>
                     </xsl:matching-substring>
                     </xsl:analyze-string>-->
                     </xsl:non-matching-substring>
                </xsl:analyze-string>
    </xsl:template>
</xsl:stylesheet>

該模板僅包含author方面,但我總共有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部分。 但其余的查詢將正常工作。

希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM