2016-10-13 3 views
0

Ich bin neu in Apache Lucene und versuche zu lernen, wie Lucene Facetten für meine Bedürfnisse verwendet werden können. Das ist mein Szenario.So filtern Sie Suchergebnisse mit Facetten in Apache Lucene

1) Ich habe eine Textsuche gemacht und die Dokumente D1, D2, D3, D4 und D5 bekommen. 2) Die Facetten erstellt F1, F2 und F3. 3) Basierend auf dem Suchergebnis nehmen wir an, dass die Facetten auf die entsprechenden Dokumente zusammen mit den Zählwerten zeigen. F1 (2 -> D1, D5), F2 (3-> D2, D4, D5) und F3 (2-> D2, D3)

4) Nehmen wir nun an, es gibt andere Dokumente wie D6, D7, die existiert sind nicht Teil der Suchergebnisse, aber existieren im Index und sie enthalten auch Facette F1.

Jetzt ist das Problem, das ich gegenüberstelle, das folgende. 1) Wenn ich mit Text gesucht habe und Dokumente von D1 bis D5 bekommen habe, möchte ich das Suchergebnis weiter filtern (eingrenzen) mit F1 facet. Das heißt, idealerweise sollte ich aus den bereits gefundenen Suchergebnissen, wenn ich die Facette F1 verwende, Dcoument D1 und D5 bekommen. Aber tatsächlich, als ich Facet F1 benutzte, bekomme ich D1, D5, D6 und D7 Dokumente als Teil der Facette F1.

Also, kann ich nicht die Facette als Filterkriterien verwenden, um weiter auf ein bereits gesucht Ergebnisse einzugrenzen. Wenn ja, bitte hilf mir mit dem Code. Wenn mein Verständnis auch falsch ist, bitte führe mich, wie man Facetten benutzt, um weiter auf einem bereits gesuchten Ergebnissen einzugrenzen, wenn überhaupt es möglich ist. Der Code, den ich verwende, ist der folgende. Ich benutze Apache Lucene 6.2.1.

 System.out.println("Enter query string:"); 
     String queryString = reader.readLine(); 
     QueryParser parser = new QueryParser("contents", 
       new StandardAnalyzer()); 
     Query query = parser.parse(queryString); 

     // TopDocs search = FacetsCollector.search(is, query, 10, srt, fc); 
     TopDocs td1 = FacetsCollector.search(is, query, 10, fc); 
     System.out.println("Total hits " + td1.totalHits); 
     for (ScoreDoc scoreDoc : td1.scoreDocs) { 
      Document doc = is.doc(scoreDoc.doc); 
      System.out.println(
        "Score-> " + scoreDoc.score + "::" + doc.get("price")); 
     } 
     Facets fcCount = new FastTaxonomyFacetCounts(tr, facetConfig_, fc); 
     List<FacetResult> allDims = fcCount.getAllDims(100); 
     for (int i = 0; i < allDims.size(); i++) { 
      FacetResult fr = allDims.get(i); 
      System.out.println("Printing for dimension - " + fr.dim); 
      LabelAndValue[] labelValues = fr.labelValues; 
      for (int j = 0; j < labelValues.length; j++) { 
       System.out.println(labelValues[j].label + "::count->" 
         + labelValues[j].value); 
       System.out.println("Docs matching for dimension " + fr.dim 
         + " with value " + labelValues[j].label); 

       /*Here I am trying to search using Facet-DIM, but have no way to connect it to already found search result.*/ 
       DrillDownQuery dq = new DrillDownQuery(facetConfig_); 
       dq.add(fr.dim, labelValues[j].label); 

       FacetsCollector fc1 = new FacetsCollector(); 
       TopDocs td2 = FacetsCollector.search(is, dq, 10, fc1); 
       System.out.println("Total hits - " + td2.totalHits); 
       for (ScoreDoc scoreDoc : td2.scoreDocs) { 
        Document doc = is.doc(scoreDoc.doc); 
        System.out.println("Score-> " + scoreDoc.score + "::" 
          + doc.get("price")); 
       } 
       System.out.println("===DRILL DOWN END==="); 
      } 
     } 

Antwort

1

Sie benötigen eine Suchanfrage als baseQuery zum DrillDownQuery Konstruktor hinzuzufügen:

DrillDownQuery dq = new DrillDownQuery(facetConfig_, query); 

Die Facette Ergebnisse haben keine Ahnung, was die ursprüngliche Abfrage war, es ist nur ein Haufen von Etiketten und Werte, so Der Konstruktor, den Sie verwenden, führt die Facettenwerte immer über alle Dokumente aus.

+0

Vielen Dank knutwalker für die Hilfe hier draußen und ja ich beobachtete, dass die Facets keine Ahnung von einem gesuchten Ergebnis als solches hat. –

0

Allerdings habe ich einen Weg gefunden, dies zu erreichen, indem ich eine Boolesche Abfrage habe, die die Suchabfrage und die DrillDownQuery mit Occur.Filter auf die folgende Weise kombiniert.

  BooleanQuery.Builder finalQueryBuilder = new BooleanQuery.Builder(); 
      finalQueryBuilder.add(searchQuery, Occur.MUST); 
      FacetsConfig facetConfig = new FacetsConfig(); 
      DrillDownQuery dq = new DrillDownQuery(facetConfig); 
      dq.add(qpKey, qpValue); 
      finalQueryBuilder.add(dq, Occur.FILTER); 
      TopDocs resultDocs = FacetsCollector.search(indexSearcher, 
        finalQueryBuilder.build(), Integer.MAX_VALUE, facetCollector); 
Verwandte Themen