2016-10-13 18 views
0

Apache Luceneを初めて使い、Lucene Facetsを自分の必要性にどのように使うことができるかを学ぼうとしています。これは私のシナリオです。Apache Luceneでファセットを使用して検索結果をフィルタリングする方法

1)テキスト検索を行い、文書D1、D2、D3、D4、D5を取得しました。 2)ファセットはF1、F2、F3を作成しました。 3)検索結果に基づいて、ファセットはカウントとともに対応するドキュメントを指し示しているものとします。 D6、D7のような他の文書が存在すると仮定しましょう。D6、D7、D6検索結果の一部ではなく、インデックスに存在し、ファセットF1も含みます。

私が直面している問題は次のとおりです。 1)テキストで検索してD1からD5に文書を取得したとき、F1ファセットを使用して検索結果をさらに絞り込む(絞り込む)必要があります。つまり、ファセットF1を使用したときに既に見つかった検索結果から理想的には、Dcoument D1とD5を取得する必要があります。しかし、実際に私がファセットF1を使用したとき、ファセットF1の一部としてD1、D5、D6、およびD7のドキュメントを取得しています。

したがって、既に検索された結果を絞り込むために、フィルタリング基準としてファセットを使用することはできません。もしそうなら、コードで私を助けてください。私の理解が間違っている場合でも、ファセットを使用して、すでに検索された結果をさらに絞る方法を教えてください。私が使用するコードは次のとおりです。私はApache Lucene 6.2.1を使用しています。

あなたが DrillDownQueryコンストラクタに baseQueryとして検索クエリを追加する必要が
 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==="); 
      } 
     } 

答えて

1

DrillDownQuery dq = new DrillDownQuery(facetConfig_, query); 

ファセット結果は、元のクエリが何であったか見当がつかない、それはこのように、ラベルと値のちょうど束です使用しているコンストラクタは、常にすべてのドキュメントに対してファセット値を実行します。

+0

ここで私を助けてくれてありがとう、ありがとうございました。私は、ファセットは検索された結果について全く知らないことを観察しました。 –

0

しかし、検索クエリとDrillDownQueryをOccur.Filterと組み合わせたブールクエリを次のように組み合わせることで、これを実現する方法を見つけました。

  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); 
関連する問題