RegEx matching using Lucene

拥有回忆 提交于 2020-01-15 23:46:41

问题


I would like to find "Bug reports" with Lucene using a regular expression, but whenever I try it doesn't work.

I used the code from the Lucene page to avoid a bad setup.

Here is my code:

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;
  }

}

I would expect bug [0-9]+ to return 1 but it doesn't. I also tested the regex with Java and it worked.


回答1:


If you have your field indexed as a "string" type (instead of "text" type), your regex would have to match the whole field value.
Try this, which takes your regex out to both ends of the field:

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



回答2:


Thanks, but this alone didn't solve the problem. The problem is the Field.Index.ANALYZED flag:

It seems that lucene doesn't index numbers in a proper way so that a regex could be used with them.

I changed:

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

to

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

and with your improved regex:

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

it finally worked! :)



来源:https://stackoverflow.com/questions/7052492/regex-matching-using-lucene

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!