Пропущенные хиты при поиске индекса lucene - PullRequest
3 голосов
/ 06 июня 2011

я индексирую один большой обзор базы данных (только текстовые поля), по которому пользователь должен иметь возможность выполнять поиск (ниже в методе indexFields). Этот поиск ранее выполнялся в базе данных по запросу ILIKE, но был медленным, поэтому теперь поиск выполняется по индексу. Однако, когда я сравниваю результаты поиска по запросу базы данных и результаты, которые я получаю с поиском по индексу, всегда есть намного меньше результатов с поиском по индексу. Я не уверен, что я делаю ошибку в индексации или в процессе поиска. Мне кажется, здесь все имеет смысл. Есть идеи?

Вот код. Все советы приветствуются!

 // INDEXING
StandardAnalyzer analyzer = new StandardAnalyzer(
                Version.LUCENE_CURRENT, stopSet); // stop set is empty
        IndexWriter writer = new IndexWriter(INDEX_DIR, analyzer, true,
                IndexWriter.MaxFieldLength.UNLIMITED);

        indexFields(writer);
        writer.optimize();
        writer.commit();
        writer.close();
        analyzer.close();

private void indexFields(IndexWriter writer) {

    DetachedCriteria criteria = DetachedCriteria
            .forClass(Activit.class);

    int count = 0;
    int max = 50000;
    boolean existMoreToIndex = true;

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


    while (existMoreToIndex) {

        try {
            result = activitService.listPaged(count, max);
            if (result.size() < max)
                existMoreToIndex = false;

            if (result.size() == 0)
                return;

            for (Activit ao : result) {
                Document doc = new Document();
                doc.add(new Field("id", String.valueOf(ao.getId()),
                        Field.Store.YES, Field.Index.ANALYZED));
                if(ao.getActivitOwner()!=null)
                    doc.add(new Field("field1", ao.getActivityOwner(),Field.Store.YES, Field.Index.ANALYZED));
                if(ao.getActivitResponsible() != null)
                    doc.add(new Field("field2", ao.getActivityResponsible(), Field.Store.YES,Field.Index.ANALYZED));

                try {
                    writer.addDocument(doc);
                } catch (CorruptIndexException e) {
                    e.printStackTrace();

            }
            count += max;

 //SEARCH
    public List<Activit> searchActivitiesInIndex(String searchCriteria) {
    Set<String> stopSet = new HashSet<String>(); // empty because we do not    want to remove stop words
    Version version = Version.LUCENE_CURRENT;
    String[] fields = {
            "field1", "field2"};
    try {
        File tempFile = new File("C://testindex");
        Directory INDEX_DIR = new SimpleFSDirectory(tempFile);
        Searcher searcher = new IndexSearcher(INDEX_DIR, true);

        QueryParser parser = new MultiFieldQueryParser(version, fields, new StandardAnalyzer(
                version, stopSet));


        Query query = parser.parse(searchCriteria);

        TopDocs topDocs = searcher.search(query, 500);

        ScoreDoc[] hits = topDocs.scoreDocs;


        //here i always get smaller hits lenght

        searcher.close();
    } catch (Exception e) {
        e.printStackTrace();
    }


}

1 Ответ

1 голос
/ 06 июня 2011

Скорее всего, анализатор делает то, что вы не ожидаете.

Откройте ваш индекс, используя Люк , вы также можете увидеть, как выглядят ваши (проанализированные) проиндексированные документы, а такжекак ваши проанализированные запросы - должны показать вам, что происходит не так.

Также, вы можете привести пример searchCriteria?И соответствующий SQL-запрос?Без этого трудно понять, правильно ли выполняется индексация.Вам также может не понадобиться использовать MultiFieldQueryParser, что весьма неэффективно.

...