使用Lucene进行RegEx匹配

java regex lucene

9419 观看

2回复

6 作者的声誉

我想使用正则表达式找到Lucene的“Bug报告”,但每当我尝试它时都不起作用。

我使用了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测试了正则表达式并且它有效。

作者: loteck 的来源 发布者: 2011 年 8 月 13 日

回应 (2)


0

307712 作者的声誉

如果您将字段索引为“字符串”类型(而不是“文本”类型),则正则表达式必须与整个字段值匹配。
试试这个,它将你的正则表达式带到了字段的两端:

System.err.println(regexQueryNrHits("^.*bug [0-9]+.*$",null));
作者: Bohemian 发布者: 13.08.2011 07:09

0

398 作者的声誉

谢谢,但仅凭这一点并没有解决问题。问题是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()));

它终于奏效了!:)

作者: loteck 发布者: 14.08.2011 10:36
32x32