आप TermDocs iterator का उपयोग कर श्रेणियों से मेल खाने वाले सभी दस्तावेजों को देखने पर विचार करना चाहेंगे।
यह उदाहरण कोड प्रत्येक "श्रेणी" अवधि के माध्यम से जाता है, और उसके बाद उस शब्द से मेल खाने वाले दस्तावेज़ों की संख्या की गणना करता है।
public static void countDocumentsInCategories(IndexReader reader) throws IOException {
TermEnum terms = null;
TermDocs td = null;
try {
terms = reader.terms(new Term("Category", ""));
td = reader.termDocs();
do {
Term currentTerm = terms.term();
if (!currentTerm.field().equals("Category")) {
break;
}
int numDocs = 0;
td.seek(terms);
while (td.next()) {
numDocs++;
}
System.out.println(currentTerm.field() + " : " + currentTerm.text() + " --> " + numDocs);
} while (terms.next());
} finally {
if (td != null) td.close();
if (terms != null) terms.close();
}
}
यह कोड बड़ी अनुक्रमणिका के लिए भी तेजी से चलना चाहिए। (!):
यहाँ कुछ कोड है कि विधि का परीक्षण करती है
public static void main(String[] args) throws Exception {
RAMDirectory store = new RAMDirectory();
IndexWriter w = new IndexWriter(store, new StandardAnalyzer());
addDocument(w, 1, "Apple", "fruit", "computer");
addDocument(w, 2, "Orange", "fruit", "colour");
addDocument(w, 3, "Dell", "computer");
addDocument(w, 4, "Cumquat", "fruit");
w.close();
IndexReader r = IndexReader.open(store);
countDocumentsInCategories(r);
r.close();
}
private static void addDocument(IndexWriter w, int id, String name, String... categories) throws IOException {
Document d = new Document();
d.add(new Field("ID", String.valueOf(id), Field.Store.YES, Field.Index.UN_TOKENIZED));
d.add(new Field("Name", name, Field.Store.NO, Field.Index.UN_TOKENIZED));
for (String category : categories) {
d.add(new Field("Category", category, Field.Store.NO, Field.Index.UN_TOKENIZED));
}
w.addDocument(d);
}
यह केवल श्रेणी फ़ील्ड में प्रत्येक शब्द द्वारा टैग किए गए दस्तावेज़ों की गणना करता है, जो आप terms.docFreq() के साथ बहुत तेज़ी से कर सकते हैं। क्या गुम है उपयोगकर्ता के खोज मानदंडों से हिट के साथ छेड़छाड़ है। – erickson