Java Lucene vs Solr,为sampe数据索引速度

Java Lucene vs Solr,为sampe数据索引速度,java,indexing,solr,lucene,full-text-search,Java,Indexing,Solr,Lucene,Full Text Search,我以前在Lucene上工作过,现在正向Solr前进。 问题是我不能像Lucene那样快速地在Solr上建立索引 我的Lucene代码: public class LuceneIndexer { public static void main(String[] args) { String indexDir = "/home/demo/indexes/index1/"; IndexWriterConfig indexWriterConfig = null; long

我以前在Lucene上工作过,现在正向Solr前进。 问题是我不能像Lucene那样快速地在Solr上建立索引

我的Lucene代码:

public class LuceneIndexer {

public static void main(String[] args) {

    String indexDir = "/home/demo/indexes/index1/"; 
    IndexWriterConfig indexWriterConfig = null;

    long starttime = System.currentTimeMillis();

    try (Directory dir = FSDirectory.open(Paths.get(indexDir));
            Analyzer analyzer = new StandardAnalyzer();
            IndexWriter indexWriter = new IndexWriter(dir,
                    (indexWriterConfig = new IndexWriterConfig(analyzer)));) {
        indexWriterConfig.setOpenMode(OpenMode.CREATE);

            StringField bat = new StringField("bat", "", Store.YES); //$NON-NLS-1$ //$NON-NLS-2$
            StringField id = new StringField("id", "", Store.YES); //$NON-NLS-1$ //$NON-NLS-2$
            StringField name = new StringField("name", "", Store.YES); //$NON-NLS-1$ //$NON-NLS-2$
            StringField id1 = new StringField("id1", "", Store.YES); //$NON-NLS-1$ //$NON-NLS-2$
            StringField name1 = new StringField("name1", "", Store.YES); //$NON-NLS-1$ //$NON-NLS-2$
            StringField id2 = new StringField("id2", "", Store.YES); //$NON-NLS-1$ //$NON-NLS-2$

            Document doc = new Document();
            doc.add(bat);doc.add(id);doc.add(name);doc.add(id1);doc.add(name1);doc.add(id2);

        for (int i = 0; i < 1000000; ++i) { 
             bat.setStringValue("book"+i);
             id.setStringValue("book id -" + i);
             name.setStringValue("The Legend of the Hobbit part 1 " + i);
             id1.setStringValue("book id -" + i);
             name1.setStringValue("The Legend of the Hobbit part 2 " + i); 
             id2.setStringValue("book id -" + i);//doc.addField("id2", "book id -" + i); //$NON-NLS-1$ 

             indexWriter.addDocument(doc);
        }
    }catch(Exception e) {
        e.printStackTrace();
    }
    long endtime = System.currentTimeMillis();
    System.out.println("commited"); //$NON-NLS-1$
    System.out.println("process completed in "+(endtime-starttime)/1000+" seconds"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
公共类LuceneIndexer{
公共静态void main(字符串[]args){
字符串indexDir=“/home/demo/index/index1/”;
IndexWriterConfig IndexWriterConfig=null;
long starttime=System.currentTimeMillis();
try(Directory dir=FSDirectory.open(path.get(indexDir));
Analyzer Analyzer=新的StandardAnalyzer();
IndexWriter IndexWriter=新的IndexWriter(目录,
(indexWriterConfig=新的indexWriterConfig(分析器));){
indexWriterConfig.setOpenMode(OpenMode.CREATE);
StringField bat=新的StringField(“bat”,Store.YES);//$NON-NLS-1$//$NON-NLS-2$
StringField id=新的StringField(“id”,“”,Store.YES);//$NON-NLS-1$//$NON-NLS-2$
StringField name=new StringField(“name”,“”,Store.YES);//$NON-NLS-1$//$NON-NLS-2$
StringField id1=新的StringField(“id1”,“”,Store.YES);//$NON-NLS-1$//$NON-NLS-2$
StringField name1=新的StringField(“name1”,是,Store.YES);//$NON-NLS-1$//$NON-NLS-2$
StringField id2=新的StringField(“id2”,“”,Store.YES);//$NON-NLS-1$//$NON-NLS-2$
单据单据=新单据();
单据添加(bat);单据添加(id);单据添加(名称);单据添加(id1);单据添加(名称1);单据添加(id2);
对于(int i=0;i<1000000;++i){
bat.设置字符串值(“账簿”+i);
id.setStringValue(“账簿id-”+i);
name.setStringValue(“霍比特人传奇第1部分”+i);
id1.设置字符串值(“账簿id-”+i);
名称1.设置字符串值(“霍比特人的传说第2部分”+i);
id2.setString值(“图书id-”+i);//doc.addField(“id2”,“图书id-”+i);//$NON-NLS-1$
indexWriter.addDocument(文档);
}
}捕获(例外e){
e、 printStackTrace();
}
long-endtime=System.currentTimeMillis();
System.out.println(“已提交”);//$NON-NLS-1$
System.out.println(“进程在“+(结束时间开始时间)/1000+”秒内完成”);//$NON-NLS-1$/$NON-NLS-2$
}
}
输出: 过程在19秒内完成

然后是我的Solr代码:

    SolrClient solrClient = new HttpSolrClient("http://localhost:8983/solr/gettingstarted"); //$NON-NLS-1$

    // Empty the database...
    solrClient.deleteByQuery( "*:*" );// delete everything! //$NON-NLS-1$
    System.out.println("cleared"); //$NON-NLS-1$
    ArrayList<SolrInputDocument> docs = new ArrayList<>();



    long starttime = System.currentTimeMillis();
    for (int i = 0; i < 1000000; ++i) { 
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("bat", "biok"+i); //$NON-NLS-1$ //$NON-NLS-2$
        doc.addField("id", "biok id -" + i); //$NON-NLS-1$ //$NON-NLS-2$
        doc.addField("name", "Tle Legend of the Hobbit part 1 " + i); //$NON-NLS-1$ //$NON-NLS-2$
        doc.addField("id1", "bopk id -" + i); //$NON-NLS-1$ //$NON-NLS-2$
        doc.addField("name1", "Tue Legend of the Hobbit part 2 " + i); //$NON-NLS-1$ //$NON-NLS-2$
        doc.addField("id2", "bopk id -" + i); //$NON-NLS-1$ //$NON-NLS-2$

        docs.add(doc);

        if (i % 250000 == 0) {
            solrClient.add(docs);
            docs.clear();
        }
    }
    solrClient.add(docs);
    System.out.println("completed adding to Solr. Now commiting.. Please wait"); //$NON-NLS-1$
    solrClient.commit();
    long endtime = System.currentTimeMillis();
    System.out.println("process completed in "+(endtime-starttime)/1000+" seconds"); //$NON-NLS-1$ //$NON-NLS-2$
SolrClient-SolrClient=新的HttpSolrClient(“http://localhost:8983/solr/gettingstarted"); //$非NLS-1$
//清空数据库。。。
solrClient.deleteByQuery(“*:*”);//删除所有内容//$非NLS-1$
系统输出打印项次(“已清除”)//$非NLS-1$
ArrayList docs=新建ArrayList();
long starttime=System.currentTimeMillis();
对于(int i=0;i<1000000;++i){
SolrInputDocument doc=新的SolrInputDocument();
文件addField(“bat”、“biok”+i);//$NON-NLS-1$//$NON-NLS-2$
doc.addField(“id”,“biok id-”+i);//$NON-NLS-1$//$NON-NLS-2$
addField博士(“姓名”,“霍比特人传奇第一部分”+i);//$NON-NLS-1$//$NON-NLS-2$
doc.addField(“id1”,“bopk id-”+i);//$NON-NLS-1$//$NON-NLS-2$
addField文件(“名字1”,“霍比特人的传说第二部分”+i);//$NON-NLS-1$//$NON-NLS-2$
doc.addField(“id2”,“bopk id-”+i);//$NON-NLS-1$//$NON-NLS-2$
docs.add(doc);
如果(i%250000==0){
solrClient.add(文档);
docs.clear();
}
}
solrClient.add(文档);
System.out.println(“已完成添加到Solr。正在提交..请稍候”)//$非NLS-1$
solrClient.commit();
long-endtime=System.currentTimeMillis();
System.out.println(“进程在“+(结束时间开始时间)/1000+”秒内完成”)//$非NLS-1$/$非NLS-2$
输出:过程在159秒内完成

我的pom.xml是


org.apache.solr
)但是,在我的演示代码中,我无法做到这一点,Lucene索引速度很快,即使不是实时的,也可以用于近实时的索引

我知道Solr使用Lucene,所以我犯了什么错误。。我仍在研究这个场景

欢迎任何帮助或指导

提前感谢。!!
干杯:)

Solr是一款通用的高度可配置的搜索服务器。Solr中的Lucene代码是针对一般用途而不是特定用例进行调优的。可以在配置和请求语法中进行一些调优

为特定用例编写的经过良好调优的Lucene代码总是优于Solr。缺点是您必须自己编写、测试和调试搜索代码的低级实现。如果这对你来说不是一个主要的缺点,那么你可能会选择Lucene。您将拥有比Solr所能提供的更多的功能,并且很可能使它运行得更快

你在Solr邮件列表上从Erick那里得到的回复是相关的。为了获得最佳索引性能,您的客户端必须同时向Solr发送更新

他提到的ConcurrentUpdateSolrClient是实现这一点的一种方法,但它有一个相当大的缺点——如果任何索引请求失败,客户端代码都不会得到通知。CUSC接受大多数例外情况


如果您想要正确的异常处理,您将需要自己管理线程并使用HttpSolrClient,如果您选择运行SolrCloud,则需要使用CloudSolrClient。SolrClient实现是线程安全的。

更新:我在Solr 5.2.0中也尝试过同样的方法,结果是一样的:Solr索引比Lucen的近实时索引(19秒)慢得多(159秒)。。有没有任何一个索引使用Solr,并发现它像Lucene一样快??你好,Elyograg,我试图在这里的Solr邮件列表中搜索Ericks的回复邮件归档文件。apache.org/mod_mbox/Lucene Solr user/201506.mbox/…但找不到,如果你能给我提供埃里克解决我问题的solr邮件列表的链接,我会很有帮助的。
<!-- solr dependency -->
    <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-solrj</artifactId>
        <version>5.0.0</version>
    </dependency>

<!-- other dependency -->   
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>

<!-- Lucene dependency -->
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>5.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-analyzers-common</artifactId>
        <version>5.0.0</version>
    </dependency>