<i id='L4YXQ'><tr id='L4YXQ'><dt id='L4YXQ'><q id='L4YXQ'><span id='L4YXQ'><b id='L4YXQ'><form id='L4YXQ'><ins id='L4YXQ'></ins><ul id='L4YXQ'></ul><sub id='L4YXQ'></sub></form><legend id='L4YXQ'></legend><bdo id='L4YXQ'><pre id='L4YXQ'><center id='L4YXQ'></center></pre></bdo></b><th id='L4YXQ'></th></span></q></dt></tr></i><div id='L4YXQ'><tfoot id='L4YXQ'></tfoot><dl id='L4YXQ'><fieldset id='L4YXQ'></fieldset></dl></div>

    <small id='L4YXQ'></small><noframes id='L4YXQ'>

    1. <tfoot id='L4YXQ'></tfoot><legend id='L4YXQ'><style id='L4YXQ'><dir id='L4YXQ'><q id='L4YXQ'></q></dir></style></legend>
        <bdo id='L4YXQ'></bdo><ul id='L4YXQ'></ul>
    2. 使用 JdbcDirectory 在数据库中创建 Lucene 索引

      Create Lucene Index in database using JdbcDirectory(使用 JdbcDirectory 在数据库中创建 Lucene 索引)
        <tfoot id='dfLNZ'></tfoot>

          <small id='dfLNZ'></small><noframes id='dfLNZ'>

            <tbody id='dfLNZ'></tbody>

          • <bdo id='dfLNZ'></bdo><ul id='dfLNZ'></ul>

              <legend id='dfLNZ'><style id='dfLNZ'><dir id='dfLNZ'><q id='dfLNZ'></q></dir></style></legend>
            1. <i id='dfLNZ'><tr id='dfLNZ'><dt id='dfLNZ'><q id='dfLNZ'><span id='dfLNZ'><b id='dfLNZ'><form id='dfLNZ'><ins id='dfLNZ'></ins><ul id='dfLNZ'></ul><sub id='dfLNZ'></sub></form><legend id='dfLNZ'></legend><bdo id='dfLNZ'><pre id='dfLNZ'><center id='dfLNZ'></center></pre></bdo></b><th id='dfLNZ'></th></span></q></dt></tr></i><div id='dfLNZ'><tfoot id='dfLNZ'></tfoot><dl id='dfLNZ'><fieldset id='dfLNZ'></fieldset></dl></div>
              • 本文介绍了使用 JdbcDirectory 在数据库中创建 Lucene 索引的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                我对 MySQL 和 Postgresql9.2 有问题,这就是问题所在:

                I have a problem with MySQL and Postgresql9.2 this is the problem :

                org.apache.lucene.store.jdbc.JdbcStoreException: Failed to execute sql [insert into             LUCENE_INDEX_TABLE (name_, value_, size_, lf_, deleted_) values ( ?, ?, ?, current_timestamp, ? )]; nested exception is org.postgresql.util.PSQLException: Les Large Objects ne devraient pas être utilisés en mode auto-commit.
                org.postgresql.util.PSQLException: Les Large Objects ne devraient pas être utilisés en mode auto-commit.
                at org.postgresql.largeobject.LargeObjectManager.createLO(LargeObjectManager.java:239)
                at org.postgresql.largeobject.LargeObjectManager.createLO(LargeObjectManager.java:226)
                at org.postgresql.jdbc2.AbstractJdbc2Statement.setBlob(AbstractJdbc2Statement.java:3048)
                at org.apache.lucene.store.jdbc.index.AbstractJdbcIndexOutput$1.fillPrepareStatement(AbstractJdbcIndexOutput.java:55)
                at org.apache.lucene.store.jdbc.support.JdbcTemplate.executeUpdate(JdbcTemplate.java:174)
                at org.apache.lucene.store.jdbc.index.AbstractJdbcIndexOutput.close(AbstractJdbcIndexOutput.java:47)
                at org.apache.lucene.store.jdbc.index.RAMAndFileJdbcIndexOutput.close(RAMAndFileJdbcIndexOutput.java:81)
                at org.apache.lucene.util.IOUtils.close(IOUtils.java:141)
                at org.apache.lucene.index.FieldsWriter.close(FieldsWriter.java:139)
                at org.apache.lucene.index.StoredFieldsWriter.flush(StoredFieldsWriter.java:55)
                at org.apache.lucene.index.DocFieldProcessor.flush(DocFieldProcessor.java:59)
                at org.apache.lucene.index.DocumentsWriter.flush(DocumentsWriter.java:581)
                at org.apache.lucene.index.IndexWriter.doFlush(IndexWriter.java:3587)
                at org.apache.lucene.index.IndexWriter.prepareCommit(IndexWriter.java:3376)
                at org.apache.lucene.index.IndexWriter.commitInternal(IndexWriter.java:3485)
                at org.apache.lucene.index.IndexWriter.commit(IndexWriter.java:3467)
                at org.apache.lucene.index.IndexWriter.commit(IndexWriter.java:3451)
                at test.lucene.chaima.JDBCIndexer.addIndex(JDBCIndexer.java:137)
                at test.lucene.chaima.JDBCIndexer.index(JDBCIndexer.java:92)
                at test.lucene.chaima.JDBCIndexer.createAndBuildIndex(JDBCIndexer.java:78)
                at test.lucene.chaima.JDBCIndexer.buildIndex(JDBCIndexer.java:69)
                at test.lucene.chaima.JDBCIndexer.main(JDBCIndexer.java:172)
                org.apache.lucene.store.jdbc.JdbcStoreException: Failed to execute sql [insert into LUCENE_INDEX_TABLE (name_, value_, size_, lf_, deleted_) values ( ?, ?, ?, current_timestamp, ? )]; nested exception is org.postgresql.util.PSQLException: Les Large Objects ne devraient pas être utilisés en mode auto-commit.
                org.postgresql.util.PSQLException: Les Large Objects ne devraient pas être utilisés en mode auto-commit.
                at org.postgresql.largeobject.LargeObjectManager.createLO(LargeObjectManager.java:239)
                at org.postgresql.largeobject.LargeObjectManager.createLO(LargeObjectManager.java:226)
                at org.postgresql.jdbc2.AbstractJdbc2Statement.setBlob(AbstractJdbc2Statement.java:3048)
                at org.apache.lucene.store.jdbc.index.AbstractJdbcIndexOutput$1.fillPrepareStatement(AbstractJdbcIndexOutput.java:55)
                at org.apache.lucene.store.jdbc.support.JdbcTemplate.executeUpdate(JdbcTemplate.java:174)
                at org.apache.lucene.store.jdbc.index.AbstractJdbcIndexOutput.close(AbstractJdbcIndexOutput.java:47)
                at org.apache.lucene.store.jdbc.index.RAMAndFileJdbcIndexOutput.close(RAMAndFileJdbcIndexOutput.java:81)
                at org.apache.lucene.store.ChecksumIndexOutput.close(ChecksumIndexOutput.java:61)
                at org.apache.lucene.index.SegmentInfos.finishCommit(SegmentInfos.java:863)
                at org.apache.lucene.index.IndexWriter.finishCommit(IndexWriter.java:3501)
                at org.apache.lucene.index.IndexWriter.commitInternal(IndexWriter.java:3490)
                at org.apache.lucene.index.IndexWriter.closeInternal(IndexWriter.java:1873)
                at org.apache.lucene.index.IndexWriter.close(IndexWriter.java:1812)
                at org.apache.lucene.index.IndexWriter.close(IndexWriter.java:1776)
                at test.lucene.chaima.JDBCIndexer.index(JDBCIndexer.java:102)
                at test.lucene.chaima.JDBCIndexer.createAndBuildIndex(JDBCIndexer.java:78)
                at test.lucene.chaima.JDBCIndexer.buildIndex(JDBCIndexer.java:69)
                at test.lucene.chaima.JDBCIndexer.main(JDBCIndexer.java:172)
                org.apache.lucene.index.IndexNotFoundException: no segments* file found in test.lucene.chaima.MyJDBCDirectory@9506dc4 lockFactory=null: files: [write.lock]
                at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:667)
                at org.apache.lucene.index.DirectoryReader.open(DirectoryReader.java:72)
                at org.apache.lucene.index.IndexReader.open(IndexReader.java:256)
                at test.lucene.chaima.JDBCSearcher.search(JDBCSearcher.java:56)
                at test.lucene.chaima.JDBCIndexer.buildIndex(JDBCIndexer.java:70)
                at test.lucene.chaima.JDBCIndexer.main(JDBCIndexer.java:172)
                

                我找到了很多解决方案,但没有人解决我的问题如果有人可以帮助我,我需要解决方案谢谢.我把我的应用程序的源代码放在这里:我有 3 个类

                i found many solution but no one solve my problem please i need the solution if any one can help me thanks. I put here the source code of my application : i have 3 classes

                MyJDBCDirectory.java

                MyJDBCDirectory.java

                    package test.lucene.chaima;
                
                import java.io.IOException;
                
                import javax.sql.DataSource;
                
                import org.apache.lucene.store.jdbc.JdbcDirectory;
                import org.apache.lucene.store.jdbc.JdbcDirectorySettings;
                import org.apache.lucene.store.jdbc.JdbcStoreException;
                import org.apache.lucene.store.jdbc.dialect.Dialect;
                import org.apache.lucene.store.jdbc.support.JdbcTable;
                
                /**
                 * The Class MyJDBCDirectory.
                 *
                 * @author prabhat.jha
                 */
                public class MyJDBCDirectory extends JdbcDirectory {
                
                    /**
                     * Instantiates a new my jdbc directory.
                     *
                     * @param dataSource
                     *            the data source
                     * @param dialect
                     *            the dialect
                     * @param settings
                     *            the settings
                     * @param tableName
                     *            the table name
                     */
                    public MyJDBCDirectory(DataSource dataSource, Dialect dialect, JdbcDirectorySettings settings, String tableName) {
                        super(dataSource, dialect, settings, tableName);
                    }
                
                    /**
                     * Instantiates a new my jdbc directory.
                     *
                     * @param dataSource the data source
                     * @param dialect the dialect
                     * @param tableName the table name
                     */
                    public MyJDBCDirectory(DataSource dataSource, Dialect dialect, String tableName) {
                        super(dataSource, dialect, tableName);
                    }
                
                    /**
                     * Instantiates a new my jdbc directory.
                     *
                     * @param dataSource the data source
                     * @param settings the settings
                     * @param tableName the table name
                     * @throws JdbcStoreException the jdbc store exception
                     */
                    public MyJDBCDirectory(DataSource dataSource, JdbcDirectorySettings settings, String tableName) throws JdbcStoreException {
                        super(dataSource, settings, tableName);
                    }
                
                    /**
                     * Instantiates a new my jdbc directory.
                     *
                     * @param dataSource the data source
                     * @param table the table
                     */
                    public MyJDBCDirectory(DataSource dataSource, JdbcTable table) {
                        super(dataSource, table);
                    }
                
                    /**
                     * Instantiates a new my jdbc directory.
                     *
                     * @param dataSource the data source
                     * @param tableName the table name
                     * @throws JdbcStoreException the jdbc store exception
                     */
                    public MyJDBCDirectory(DataSource dataSource, String tableName) throws JdbcStoreException {
                        super(dataSource, tableName);
                    }
                
                    /**
                     * (non-Javadoc).
                     *
                     * @return the string[]
                     * @throws IOException Signals that an I/O exception has occurred.
                     * @see org.apache.lucene.store.Directory#listAll()
                     */
                    @Override
                    public String[] listAll() throws IOException {
                        return super.list();
                    }
                
                }
                

                JDBCDatabaseUtil.java

                JDBCDatabaseUtil.java

                    package test.lucene.chaima;
                
                import java.sql.Connection;
                import java.sql.SQLException;
                
                import javax.sql.DataSource;
                
                import org.postgresql.ds.PGPoolingDataSource;
                import org.postgresql.ds.PGSimpleDataSource;
                
                
                //import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
                
                
                /**
                 * The Class JDBCDatabaseUtil.
                 * @author prabhat.jha
                 */
                public class JDBCDatabaseUtil {
                    /**
                     * Gets the data source.
                     *
                     * @return the data source
                     */
                    public static DataSource getDataSource() {
                        PGSimpleDataSource dataSource = new PGSimpleDataSource();
                        dataSource.setUser("postgres"); 
                        dataSource.setPassword("root"); 
                        dataSource.setDatabaseName("postgres");
                        /*MysqlDataSource dataSource = new MysqlDataSource();
                        dataSource.setUser("root");
                        dataSource.setPassword("root");
                        dataSource.setEmulateLocators(true);
                        dataSource.setUrl("jdbc:mysql://localhost:3306/lucene?emulateLocators=true&useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false");
                        */
                        return dataSource;
                    }
                
                    /**
                     * Gets the connection.
                     *
                     * @return the connection
                     * @throws SQLException
                     *             the sQL exception
                     */
                    public static Connection getConnection() throws SQLException {
                        //getDataSource().getConnection().setAutoCommit(false);
                        return getDataSource().getConnection();
                    }
                }
                

                JDBCIndexer.java

                JDBCIndexer.java

                    package test.lucene.chaima;
                
                import java.io.IOException;
                import java.sql.Connection;
                import java.sql.PreparedStatement;
                import java.sql.ResultSet;
                import java.sql.SQLException;
                
                import org.apache.lucene.analysis.Analyzer;
                import org.apache.lucene.analysis.SimpleAnalyzer;
                import org.apache.lucene.document.Document;
                import org.apache.lucene.document.Field;
                import org.apache.lucene.index.CorruptIndexException;
                import org.apache.lucene.index.IndexWriter;
                import org.apache.lucene.index.IndexWriterConfig;
                import org.apache.lucene.store.Directory;
                import org.apache.lucene.store.LockObtainFailedException;
                import org.apache.lucene.store.jdbc.JdbcDirectory;
                import org.apache.lucene.store.jdbc.dialect.PostgreSQLDialect;
                import org.apache.lucene.util.Version;
                
                /**
                 * The Class JDBCIndexer.
                 *
                 * @author chaima
                 */
                public class JDBCIndexer {
                
                    /** The jdbc directory. */
                    private Directory   jdbcDirectory   = null;
                
                    /**
                     * Instantiates a new jDBC indexer.
                     *
                     * @param jdbcDirectory
                     *            the jdbc directory
                     */
                    public JDBCIndexer(Directory jdbcDirectory) {
                        super();
                        this.jdbcDirectory = jdbcDirectory;
                    }
                    /**
                     * Gets the jdbc directory.
                     *
                     * @return the jdbc directory
                     */
                    public Directory getJdbcDirectory() {
                        if (jdbcDirectory == null) {
                            throw new IllegalStateException("Index not yet build, rerun indexing");
                        }
                        return jdbcDirectory;
                    }
                
                    /**
                     * Sets the jdbc directory.
                     *
                     * @param jdbcDirectory
                     *            the new jdbc directory
                     */
                    public void setJdbcDirectory(Directory jdbcDirectory) {
                        this.jdbcDirectory = jdbcDirectory;
                    }
                
                    /**
                     * Builds the index.
                     */
                    public void buildIndex() {
                        createAndBuildIndex();
                    }
                
                    /**
                     * Creates the and build index.
                     */
                    private void createAndBuildIndex() {
                       createIndexTable();
                        index();
                    }
                
                    /**
                     * Index.
                     */
                    private void index() {
                        Analyzer analyzer = new SimpleAnalyzer(Version.LUCENE_36);
                        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36, analyzer);
                        IndexWriter indexWriter = null;
                        try {
                            indexWriter = new IndexWriter(getJdbcDirectory(), analyzer,true, IndexWriter.MaxFieldLength.UNLIMITED);
                            Boolean locked=indexWriter.isLocked(jdbcDirectory);
                            addIndex(indexWriter);
                        } catch (CorruptIndexException e) {
                            e.printStackTrace();
                        } catch (LockObtainFailedException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            if (indexWriter != null) {
                                try {
                                    indexWriter.close();
                                } catch (CorruptIndexException e) {
                                    e.printStackTrace();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                } finally {
                                    indexWriter = null;
                                }
                            }
                        }
                    }
                
                    /**
                     * 
                     *
                     * @param indexWriter
                     *            the index writer
                     */
                    private void addIndex(IndexWriter indexWriter) throws CorruptIndexException, IOException {
                     try {
                      Connection connection = JDBCDatabaseUtil.getConnection();
                      connection.setAutoCommit(false);
                      String query = "SELECT id, name, lastname FROM users";
                      PreparedStatement pstmt = connection.prepareStatement(query);
                      ResultSet resultSet = pstmt.executeQuery();
                      while (resultSet.next()) {
                       Document document = new Document();
                       document.add(new Field("id", String.valueOf(resultSet.getInt(1)), Field.Store.YES, Field.Index.ANALYZED));
                       document.add(new Field("name", String.valueOf(resultSet.getString(2)), Field.Store.YES, Field.Index.ANALYZED));
                       document.add(new Field("lastname", String.valueOf(resultSet.getString(3)), Field.Store.YES, Field.Index.ANALYZED));
                
                       indexWriter.addDocument(document);
                       indexWriter.commit();
                     }
                     indexWriter.close();   
                     } catch (SQLException e) {
                      e.printStackTrace();
                     }
                    }
                
                    /**
                     * Creates the index table.
                     */
                    private void createIndexTable() {
                        if (this.jdbcDirectory == null) {
                            setJdbcDirectory(new MyJDBCDirectory(JDBCDatabaseUtil.getDataSource(), new PostgreSQLDialect(), "LUCENE_INDEX_TABLE"));
                        }
                        try {
                            /**
                             * No need to manually create index table, create method will
                             * automatically create it.
                             */
                           boolean existe= ((JdbcDirectory) getJdbcDirectory()).tableExists();
                           if(existe)
                               System.out.println("table existe");
                           else{
                               System.out.println("table non existe");
                               ((JdbcDirectory) getJdbcDirectory()).create(); 
                           }
                
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                
                    public static void main(String[] args) {
                        new JDBCIndexer(null).buildIndex();
                    }
                }
                

                和表用户:

                    CREATE TABLE users
                (
                  id integer NOT NULL,
                  name character(20),
                  lastname character(20),
                  CONSTRAINT pk_id PRIMARY KEY (id)
                )
                WITH (
                  OIDS=FALSE
                );
                ALTER TABLE users
                  OWNER TO postgres;
                

                还有罐子:

                    commons-logging-1.0.4.jar
                compass-2.2.0.jar
                lucene-core-3.6.1.jar
                postgresql-9.2-1002.jdbc4.jar
                

                推荐答案

                我已经创建了自己的 JdbcDirectory 实现,尽管它会依赖 JEE6 来利用 @Singleton 注释.代码本身并不是太简单,无法粘贴到 StackOverflow 帖子中,它仍然有一些限制.关键部分是由于数据库锁定语义,您不能使用多个线程对单个事务执行多个操作.

                I have created my own JdbcDirectory implementation, though it would rely on JEE6 to take advantage of the @Singleton annotation. The code itself isn't too trivial to paste into a StackOverflow post and it still has a few limitations. Key part being you cannot do multiple operations on a single transaction using multiple threads because of the database locking semantics.

                https://github.com/trajano/doxdb/tree/jdbc-directory-example/doxdb-ejb/src/main/java/net/trajano/doxdb/search/lucene

                查看您的实现,您似乎还保留了已删除的文件",这可能是因为它在数据库存储中的碎片较少,而我的已删除记录本身.

                Looking at your implementation, it seems like you're also keeping the deleted "files" probably because it would have less fragmentation on the database store, whereas mine I had removed the record itself.

                我已经标记了一个我正在使用的版本,它对于我的测试负载来说似乎足够稳定.随时提出意见或建议.

                I have tagged a version that I am working with which seems stable enough for my test loads. Feel free to make comments or suggestions on it.

                这篇关于使用 JdbcDirectory 在数据库中创建 Lucene 索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                Lucene Porter Stemmer not public(Lucene Porter Stemmer 未公开)
                How to index pdf, ppt, xl files in lucene (java based or python or php any of these is fine)?(如何在 lucene 中索引 pdf、ppt、xl 文件(基于 java 或 python 或 php 中的任何一个都可以)?)
                KeywordAnalyzer and LowerCaseFilter/LowerCaseTokenizer(KeywordAnalyzer 和 LowerCaseFilter/LowerCaseTokenizer)
                How to search between dates (Hibernate Search)?(如何在日期之间搜索(休眠搜索)?)
                How to get positions from a document term vector in Lucene?(如何从 Lucene 中的文档术语向量中获取位置?)
                Java Lucene 4.5 how to search by case insensitive(Java Lucene 4.5如何按不区分大小写进行搜索)
                  <tbody id='rQRvn'></tbody>
                • <bdo id='rQRvn'></bdo><ul id='rQRvn'></ul>

                  <small id='rQRvn'></small><noframes id='rQRvn'>

                  • <legend id='rQRvn'><style id='rQRvn'><dir id='rQRvn'><q id='rQRvn'></q></dir></style></legend>
                    • <tfoot id='rQRvn'></tfoot>

                        <i id='rQRvn'><tr id='rQRvn'><dt id='rQRvn'><q id='rQRvn'><span id='rQRvn'><b id='rQRvn'><form id='rQRvn'><ins id='rQRvn'></ins><ul id='rQRvn'></ul><sub id='rQRvn'></sub></form><legend id='rQRvn'></legend><bdo id='rQRvn'><pre id='rQRvn'><center id='rQRvn'></center></pre></bdo></b><th id='rQRvn'></th></span></q></dt></tr></i><div id='rQRvn'><tfoot id='rQRvn'></tfoot><dl id='rQRvn'><fieldset id='rQRvn'></fieldset></dl></div>