首页 > 代码库 > lucene 4.0 - Facet demo

lucene 4.0 - Facet demo

package com.fox.facet;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field.Store;import org.apache.lucene.document.StringField;import org.apache.lucene.facet.index.CategoryDocumentBuilder;import org.apache.lucene.facet.search.FacetsCollector;import org.apache.lucene.facet.search.params.CountFacetRequest;import org.apache.lucene.facet.search.params.FacetSearchParams;import org.apache.lucene.facet.search.results.FacetResult;import org.apache.lucene.facet.search.results.FacetResultNode;import org.apache.lucene.facet.taxonomy.CategoryPath;import org.apache.lucene.facet.taxonomy.TaxonomyReader;import org.apache.lucene.facet.taxonomy.TaxonomyWriter;import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyReader;import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyWriter;import org.apache.lucene.index.DirectoryReader;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.index.IndexWriterConfig.OpenMode;import org.apache.lucene.index.Term;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.MultiCollector;import org.apache.lucene.search.Query;import org.apache.lucene.search.TermQuery;import org.apache.lucene.search.TopScoreDocCollector;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;public class FacetingExample {    private static final String INDEX = "d:/facet/index";    private static final String INDEX_TAXO = "d:/facet/taxo";    public static void main(final String[] args) throws IOException {        Directory dir = FSDirectory.open(new File(INDEX));        Directory taxoDir = FSDirectory.open(new File(INDEX_TAXO));        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);        IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_40, analyzer);        iwc.setOpenMode(OpenMode.CREATE);        IndexWriter writer = new IndexWriter(dir, iwc);        TaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(taxoDir, OpenMode.CREATE_OR_APPEND);        List<Book> books = Arrays.asList(new Book("Tom Sawyer", "Mark Twain", "1840", "Novel"), new Book("Collected Tales",                "Mark Twain", "1850", "Novel"), new Book("The Trial", "Franz Kafka", "1901", "Novel"), new Book("Some book",                "Some author", "1901", "Novel"));        createDocuments(writer, taxoWriter, books);        taxoWriter.commit();        writer.commit();        writer.close();        taxoWriter.close();        IndexReader indexReader = DirectoryReader.open(dir);        IndexSearcher searcher = new IndexSearcher(indexReader);        TaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoDir);        Query q = new TermQuery(new Term("category", "Novel"));        TopScoreDocCollector tdc = TopScoreDocCollector.create(10, true);        FacetSearchParams facetSearchParams = new FacetSearchParams();        facetSearchParams.addFacetRequest(new CountFacetRequest(new CategoryPath("author"), 10));        facetSearchParams.addFacetRequest(new CountFacetRequest(new CategoryPath("category"), 10));        facetSearchParams.addFacetRequest(new CountFacetRequest(new CategoryPath("published"), 10));        FacetsCollector facetsCollector = new FacetsCollector(facetSearchParams, indexReader, taxoReader);        searcher.search(q, MultiCollector.wrap(tdc, facetsCollector));        List<FacetResult> res = facetsCollector.getFacetResults();        System.out.println("Search for books with the category:Novel returned : " + res.size()                + " results\n---------------------------------");        for (final FacetResult r : res) {            System.out.println("\nMatching " + r.getFacetResultNode().getLabel() + ":\n------------------------------------");            for (FacetResultNode n : r.getFacetResultNode().getSubResults()) {                System.out.println(String.format("\t%s: %.0f", n.getLabel().lastComponent(), n.getValue()));            }        }    }    private static void createDocuments(final IndexWriter writer, final TaxonomyWriter taxoWriter, final List<Book> books)            throws IOException {        for (final Book b : books) {            Document doc = new Document();            doc.add(new StringField("title", b.getTitle(), Store.YES));            doc.add(new StringField("category", b.getCategory(), Store.YES));            List<CategoryPath> categories = new ArrayList<CategoryPath>();            categories.add(new CategoryPath("author", b.getAuthor()));            categories.add(new CategoryPath("category", b.getCategory()));            categories.add(new CategoryPath("published", b.getPublished()));            CategoryDocumentBuilder categoryDocBuilder = new CategoryDocumentBuilder(taxoWriter);            categoryDocBuilder.setCategoryPaths(categories);            categoryDocBuilder.build(doc);            writer.addDocument(doc);        }    }}class Book {    private final String title;    private final String author;    private final String published;    private final String category;    public Book(final String title, final String author, final String published, final String category) {        this.title = title;        this.author = author;        this.published = published;        this.category = category;    }    public String getTitle() {        return title;    }    public String getAuthor() {        return author;    }    public String getPublished() {        return published;    }    public String getCategory() {        return category;    }}

 

Result

Search for books with the category:Novel returned : 3 results---------------------------------Matching author:------------------------------------    Mark Twain: 2    Some author: 1    Franz Kafka: 1Matching category:------------------------------------    Novel: 4Matching published:------------------------------------    1901: 2    1850: 1    1840: 1

 

lucene 4.0 - Facet demo