Обновленный способ использования Apache Lucene - PullRequest
0 голосов
/ 17 октября 2019
package com.dev3.main;

import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.index.CorruptIndexException;

import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;


public class ExtractRaw {
    /*
     * private static IndexWriter writer;
     * 
     * @SuppressWarnings("deprecation") public void Indexer(String
     * indexDirectoryPath) throws IOException { Directory indexDirectory =
     * FSDirectory.open(new File(indexDirectoryPath));
     * 
     * //create the indexer writer = new IndexWriter(indexDirectory, new
     * StandardAnalyzer(Version.LUCENE_30),true,IndexWriter.MaxFieldLength.UNLIMITED
     * ); }
     * 
     * public void close() throws CorruptIndexException, IOException {
     * writer.close(); }
     */

    @SuppressWarnings("resource")
    public static void main(String[] args) throws Exception {
        String conn = "jdbc:mysql://localhost:3306/d_accesslog";
        String username = "root";
        String pwd = "root";
        String sql = "select RawData from t_weblogic_test";

        Directory indexDirectory = FSDirectory.open(Paths.get("C:/DEV/index"));  

        Directory memoryIndex = new RAMDirectory();

        StandardAnalyzer analyzer = new StandardAnalyzer();
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
        IndexWriter writer = new IndexWriter(memoryIndex, indexWriterConfig);
        try (Connection con = DriverManager.getConnection(conn, username, pwd);
                PreparedStatement ps = con.prepareStatement(sql);) {
            ResultSet rs = con.createStatement().executeQuery(sql);
            while (rs.next()) {
                Document doc = new Document();
                doc.add(new StringField("RawData", rs.getString("RawData"), Field.Store.YES));

                writer.addDocument(doc);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

Я пытался следовать учебнику в Интернете, один из учебников выглядит как выше. но я не знаю, что и как работает lucene в Java. Кто-нибудь может мне помочь? я новичок в Lucene и есть ли новый способ реализации Lucene на Java? и есть ли какой-нибудь источник, который мог бы помочь мне понять люцен с основ. Большинство уроков просто используют файловый поток, а не базу данных. Я хочу знать, как, если я использую базу данных в Lucene. Я хочу извлечь данные из базы данных, используя Lucene.

my pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>Dev3</groupId>
    <artifactId>Dev3</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core -->

        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>8.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queries</artifactId>
            <version>8.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-test-framework</artifactId>
            <version>8.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>8.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>8.2.0</version>
        </dependency>
    </dependencies>


    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

1 Ответ

2 голосов
/ 18 октября 2019

Вы пропустили самые важные шаги:

  • Укажите каталог индекса:

    // eg. using filesystem 
    Directory indexDirectory = FSDirectory.open(Paths.get("C:/DEV/index"));     
    // ... or using RAM
    Directory memoryIndex = new RAMDirectory();
    
  • Используйте analyzer:

    StandardAnalyzer analyzer = new StandardAnalyzer();
    
  • Создать с этим анализатором indexWriterConfig:

    IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
    
  • Создать средство записи индекса с помощьюКонфигурация Writer и индексные объекты каталога:

    IndexWriter writer = new IndexWriter(memoryIndex, indexWriterConfig);
    

Теперь ваш писатель должен иметь возможность правильно индексировать документы. Используйте Field() и Document() для создания контента для индексации.

Если вы не знакомы с Lucene, вы можете использовать один из подклассов Field вместо Field() напрямую. В вашем случае это будет TextField(), если вы хотите, чтобы содержимое поля индексировалось для полнотекстового поиска, или StringField(), если вы хотите, чтобы поле оставалось UN_TOKENIZED (содержимое индексируется как один токен), например. :

Document doc = new Document();
doc.add(new StringField("RawData", rs.getString("RawData"), Field.Store.YES));

И, наконец:

writer.addDocument(doc);
...