Соответствие RegEx с использованием Lucene - PullRequest
1 голос
/ 13 августа 2011

Я хотел бы найти "Отчеты об ошибках" с Lucene, используя регулярное выражение, но всякий раз, когда я пытаюсь это сделать, это не работает.

Я использовал код со страницы Lucene , чтобыизбежать неправильной настройки.

Вот мой код:

import java.util.regex.Pattern;

import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.regex.JakartaRegexpCapabilities;
import org.apache.lucene.search.regex.RegexCapabilities;
import org.apache.lucene.search.regex.RegexQuery;
import org.apache.lucene.store.RAMDirectory;

public class Rege {

  private static IndexSearcher searcher;
  private static final String FN = "field";

  public static void main(String[] args) throws Exception {
    RAMDirectory directory = new RAMDirectory();
    try {

      IndexWriter writer = new IndexWriter(directory,
          new SimpleAnalyzer(), true,
          IndexWriter.MaxFieldLength.LIMITED);
      Document doc = new Document();
      doc
          .add(new Field(
              FN,
              "[Phpmyadmin-devel] Commits against bug 601721 (Cookie auth mode faulty with IIS)",
              Field.Store.NO, Field.Index.ANALYZED));
      writer.addDocument(doc);
      writer.optimize();
      writer.close();
      searcher = new IndexSearcher(directory, true);

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

    System.err.println(regexQueryNrHits("bug [0-9]+",null));

  }

  private static Term newTerm(String value) {
    return new Term(FN, value);
  }

  private static int regexQueryNrHits(String regex,
      RegexCapabilities capability) throws Exception {

    RegexQuery query = new RegexQuery(newTerm(regex));

    if (capability != null)
      query.setRegexImplementation(capability);

    return searcher.search(query, null, 1000).totalHits;
  }

}

Я бы ожидал, что bug [0-9]+ вернет 1, но это не так.Я также протестировал регулярное выражение с Java, и оно сработало.

Ответы [ 2 ]

0 голосов
/ 14 августа 2011

Спасибо, но одно это не решило проблему. Проблема заключается в флаге Field.Index.ANALYZED:

Похоже, что lucene неправильно индексирует числа, чтобы с ними можно было использовать регулярное выражение.

Я изменил:

doc.add(new Field(
FN,"[Phpmyadmin-devel] Commits against bug 601721 (Cookie auth mode faulty with IIS)",Field.Store.NO, Field.Index.ANALYZED));

до

    doc.add(new Field(
FN,"[Phpmyadmin-devel] Commits against bug 601721 (Cookie auth mode faulty with IIS)",Field.Store.NO, Field.Index.NOT_ANALYZED));

и с вашим улучшенным регулярным выражением:

    System.err.println(regexQueryNrHits("^.*bug #+[0-9]+.*$",
new JavaUtilRegexCapabilities()));

наконец-то это сработало! :)

0 голосов
/ 13 августа 2011

Если ваше поле проиндексировано как «строковый» тип (вместо «текстового» типа), ваше регулярное выражение должно соответствовать значению поля whole .
Попробуйте это, чтобы вывести свое регулярное выражение на оба конца поля:

System.err.println(regexQueryNrHits("^.*bug [0-9]+.*$",null));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...