Lucene странное поведение - PullRequest
       0

Lucene странное поведение

0 голосов
/ 26 января 2011

Я пытаюсь начать использовать люцен.Код, который я использую для индексирования документов:

public void index(String type, String words) {
        IndexWriter indexWriter = null;
        try {
            if (dir == null)
                dir = createAndPropagate();
            indexWriter = new IndexWriter(dir, new StandardAnalyzer(), true,
                    new KeepOnlyLastCommitDeletionPolicy(),
                    IndexWriter.MaxFieldLength.UNLIMITED);

            Field wordsField = new Field(FIELD_WORDS, words, Field.Store.YES,
                    Field.Index.ANALYZED);
            Field typeField = new Field(FIELD_TYPE, type, Field.Store.YES,
                    Field.Index.ANALYZED);

            Document doc = new Document();
            doc.add(wordsField);
            doc.add(typeField);

            indexWriter.addDocument(doc);
            indexWriter.commit();
        } catch (IOException e) {
            logger.error("Problems while adding entry to index.", e);
            } finally {
            try {
                if (indexWriter != null)
                    indexWriter.close();
            } catch (IOException e) {
                logger.error("Unable to close index writer.", e);
            }
        }

    }

Поиск выглядит следующим образом:

public List<TagSearchEntity> searchFor(final String type, String words,
            int amount) {
        List<TagSearchEntity> result = new ArrayList<TagSearchEntity>();

        try {
            if (dir == null)
                dir = createAndPropagate();

            for (final Document doc : searchFor(dir, type, words, amount)) {
                @SuppressWarnings("serial")
                TagSearchEntity searchResult = new TagSearchEntity() {{
                    setType(type);
                    setWords(doc.getField(FIELD_WORDS).stringValue());
                }};
                result.add(searchResult);
            }
        } catch (IOException e) {
            logger.error("Problems while searching", e);
        }

        return result;
    }

private List<Document> searchFor(Directory indexDirectory, String type,
            String words, int amount) throws IOException {
        Searcher indexSearcher = new IndexSearcher(indexDirectory);

        final Query tagQuery = new TermQuery(new Term(FIELD_WORDS, words));
        final Query typeQuery = new TermQuery(new Term(FIELD_TYPE, type));

        @SuppressWarnings("serial")
        BooleanQuery query = new BooleanQuery() {{
            add(tagQuery, BooleanClause.Occur.SHOULD);
            add(typeQuery, BooleanClause.Occur.MUST);
        }};

        List<Document> result = new ArrayList<Document>();

        for (ScoreDoc scoreDoc : indexSearcher.search(query, amount).scoreDocs) {
            result.add(indexSearcher.doc(scoreDoc.doc));
        }

        indexSearcher.close();

        return result;
    }

У меня есть два варианта использования.Первый добавляет документ некоторого типа, затем ищет его, затем добавляет документ другого типа, затем ищет его и т. Д. Другой добавляет все документы, а затем ищет их.Первый работает нормально:

@Test
    public void testSearch() {
        search.index("type1", "test type1 for test purposes test test");
        List<TagSearchEntity> result = search.searchFor("type1", "test", 10);
        assertNotNull("Retrieved list should not be null.", result);
        assertTrue("Retrieved list should not be empty.", !result.isEmpty());

        search.index("type2", "test type2 for test purposes test test");
        result.clear();
        result = search.searchFor("type2", "test", 10);
        assertTrue("Retrieved list should not be empty.", !result.isEmpty());

        search.index("type3", "test type3 for test purposes test test");
        result.clear();
        result = search.searchFor("type3", "test", 10);
        assertTrue("Retrieved list should not be empty.", !result.isEmpty());
    }

Но другой, кажется, индексирует только последний документ:

@Test
    public void testBuggy() {
       search.index("type1", "test type1 for test purposes test test");
       search.index("type2", "test type2 for test purposes test test");
       search.index("type3", "test type3 for test purposes test test");

        List<TagSearchEntity> result = search.searchFor("type3", "test", 10);
        assertNotNull("Retrieved list should not be null.", result);
        assertTrue("Retrieved list should not be empty.", !result.isEmpty());

        result.clear();
        result = search.searchFor("type2", "test", 10);
        assertTrue("Retrieved list should not be empty.", !result.isEmpty());

        result.clear();
        result = search.searchFor("type1", "test", 10);
        assertTrue("Retrieved list should not be empty.", !result.isEmpty());
    }

Он успешно находит type3, но не может найти вседругие.Если я обработаю эти вызовы, он все равно успешно найдет только последний проиндексированный документ.Версия Lucene, которую я использую:

    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>2.4.1</version>
    </dependency>

    <dependency>
        <groupId>lucene</groupId>
        <artifactId>lucene</artifactId>
        <version>1.4.3</version>
    </dependency>

Что я делаю не так?Как сделать так, чтобы он индексировал все документы?

1 Ответ

2 голосов
/ 26 января 2011

Новый индекс создается после каждой операции с индексом.Третий аргумент - флаг create, и он устанавливается в значение true.Согласно документации IndexWriter , если этот флаг установлен, он либо создаст новый индекс, либо перезапишет существующий.Установите значение false, чтобы добавить к существующему индексу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...