代码之家  ›  专栏  ›  技术社区  ›  vishnu

内存索引和lucene文件索引有什么区别?

  •  1
  • vishnu  · 技术社区  · 6 年前

    我对内存中的索引概念很陌生。我们目前正在使用lucene文件索引技术对记录进行索引和搜索。 您能告诉我我们如何实现内存中的索引吗?与lucene文件索引相比,这种类型的索引有什么优势?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Prakhar Nigam    6 年前

    检查此答案以比较FSDirectory和内存中的RAMDIrectory Comparison

    如何使用RAMDirectory:

    RAMDirectory idx = new RAMDirectory(); 
    IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
    iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
    IndexWriter writer = new IndexWriter(idx, iwc);
    Iterator<Map.Entry<String, String>> it = inputCategoryMap.entrySet().iterator();
        while (it.hasNext()) {
            Document doc = new Document();
            Map.Entry<String, String> pair = it.next();
            FieldType contentType = new FieldType();
            contentType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
            contentType.setStored(true);
            contentType.setTokenized(true);
            contentType.setStoreTermVectors(true);
            doc.add(new Field(TITLE, pair.getKey(), TextField.TYPE_STORED));
            doc.add(new Field(CONTENT, pair.getValue(),contentType ));
            dcmnts.add(doc);
        }
        writer.addDocuments(dcmnts);
        writer.commit();
        System.out.println("No of documents added in the index "+writer.maxDoc());
        writer.close();
       System.out.println("Size consumed by Ram  "+idx.ramBytesUsed()+"\nTime Consumed By Lucene  "+stopwatch.getTime(TimeUnit.SECONDS));
    

    使用FSDirectory的方法相同。有一些小改动。

    从FSDirectory复制索引的其他一些方法。。

    private RAMDirectory(FSDirectory dir, boolean closeDir, IOContext context) throws IOException {
    this();
    for (String file : dir.listAll()) {
      if (!Files.isDirectory(dir.getDirectory().resolve(file))) {
        copyFrom(dir, file, file, context);
      }
    }
    if (closeDir) {
      dir.close();
    }
    }