有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Lucene 4.0中的java术语频率

尝试使用Lucene 4.0计算术语频率。我让文档频率正常工作,但不知道如何使用API来实现术语频率。以下是我的代码:

private static void addDoc(IndexWriter writer, String content) throws IOException {
    FieldType fieldType = new FieldType();
    fieldType.setStoreTermVectors(true);
    fieldType.setStoreTermVectorPositions(true);
    fieldType.setIndexed(true);
    fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS);
    fieldType.setStored(true);
    Document doc = new Document();
    doc.add(new Field("content", content, fieldType));
    writer.addDocument(doc);
}

public static void main(String[] args) throws IOException, ParseException {
    Directory directory = new RAMDirectory();  
    Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_40);
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);
    IndexWriter writer = new IndexWriter(directory, config);
    addDoc(writer, "Lucene is stupid");
    addDoc(writer, "Java is great");
    writer.close();
    IndexReader reader = DirectoryReader.open(directory);
    System.out.println(reader.docFreq(new Term("content", "Lucene")));
    reader.close();
}

我尝试过做一些类似reader.getTermVector(0, "content")...的事情,但找不到一种方法来获取文档中某个特定术语的频率

谢谢


共 (1) 个答案

  1. # 1 楼答案

    K,找到答案了。您可以从MultiFields获取DocsEnum对象,然后对其进行迭代

    private static void addDoc(IndexWriter writer, String content) throws IOException {
        FieldType fieldType = new FieldType();
        fieldType.setStoreTermVectors(true);
        fieldType.setStoreTermVectorPositions(true);
        fieldType.setIndexed(true);
        fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS);
        fieldType.setStored(true);
        Document doc = new Document();
        doc.add(new Field("content", content, fieldType));
        writer.addDocument(doc);
    }
    
    public static void main(String[] args) throws IOException, ParseException {
        Directory directory = new RAMDirectory();  
        Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_40);
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);
        IndexWriter writer = new IndexWriter(directory, config);
        addDoc(writer, "bla bla bla bleu bleu");
        addDoc(writer, "bla bla bla bla");
        writer.close();
        DirectoryReader reader = DirectoryReader.open(directory);
        DocsEnum de = MultiFields.getTermDocsEnum(reader, MultiFields.getLiveDocs(reader), "content", new BytesRef("bla"));
        int doc;
        while((doc = de.nextDoc()) != DocsEnum.NO_MORE_DOCS) {
              System.out.println(de.freq());
        }
        reader.close();
    }