1

ニュース Web サイトの検索機能を実装しています。そのウェブサイトでは、ユーザーはタイトルとテキストを含むニュース記事を投稿します。現在、これらの記事はデータベースに直接挿入されています。長い長いテキストを含むデータベース内の全文検索は効率的ではないと聞いています。

そこで、索引付けと検索に lucene を使用してみました。それを使用して完全なデータベースにインデックスを付けることができ、コンテンツを検索することもできます.しかし、最善のアプローチを使用しているかどうかはわかりません.

ここに私のインデクサークラスがあります:

public class LuceneIndexer {
    public static void indexNews(Paste p ,IndexWriter indexWriter) throws IOException {

        Document doc = new Document();
        doc.add(new Field("id", p.getNewsId(), Field.Store.YES, Field.Index.NO));
        doc.add(new Field("title", p.getTitle(), Field.Store.YES, Field.Index.TOKENIZED));
        doc.add(new Field("text", p.getNewsRawText(), Field.Store.YES, Field.Index.UN_TOKENIZED));
        String fullSearchableText = p.getTitle() + " " + p.getNewsRawText();

        doc.add(new Field("content", fullSearchableText, Field.Store.NO, Field.Index.TOKENIZED));
        indexWriter.addDocument(doc);
    }

    public static void rebuildIndexes() {


        try {
            System.out.println("started indexing");
            IndexWriter w = getIndexWriter();
            ArrayList<News> n = new GetNewsInfo().getLastPosts(0);
            for (News news : n) {
                indexNews(news,w );
            }
             closeIndexWriter(w);
             System.out.println("indexing done");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

    public static IndexWriter getIndexWriter() throws CorruptIndexException, LockObtainFailedException, IOException {

        IndexWriter indexWriter = new IndexWriter(GlobalData.LUCENE_INDEX_STOREAGE, new StandardAnalyzer(), true);
        return indexWriter;
    }

    public static void closeIndexWriter(IndexWriter w) throws CorruptIndexException, IOException {
        w.close();

    }

上記のコードは効率的ですか?

データベース全体のインデックスを再度作成するのではなく、ユーザーが送信したときにドキュメントをインデックスに追加する必要があると思います。

  • 記事が送信されるたびに新しい IndexWriter を作成する必要がありますか?
  • IndexWriter を頻繁に開いたり閉じたりするのは効率的ですか?
4

2 に答える 2

1

すべてのドキュメントをインデックスに読み込む必要はなく、新しいドキュメントを追加するだけでよく、残りはインデックスに残ります。

ただし、毎回新しい IndexWriter を作成する必要があります。必要に応じて、サービスまたは IndexWriter を維持する何かを使用できますが、開始と終了にはそれほど時間がかかりません。IndexWriter を再利用する場合は、追加するたびに必ず indexWriter.commit() を使用してください。

于 2012-07-27T11:54:22.587 に答える
0

記事が送信されるたびに新しい IndexWriter を作成する必要がありますか?

いいえ

IndexWriter を頻繁に開いたり閉じたりするのは効率的ですか?

絶対にありません!ここでインデックス作成のガイドラインを読む必要があります。

于 2012-07-27T11:55:36.580 に答える