Java Lucene查询与内容中的正则表达式字符不匹配

Java Lucene查询与内容中的正则表达式字符不匹配,java,lucene,Java,Lucene,下面是我为匹配lucene索引内容而编写的代码片段。这段代码适用于术语“loop_2;”的查询,但不适用于术语“loop*”的查询。详情如下 我正在努力想办法让它发挥作用: public class TryLuceneQuery { public static void main(String[] args) { try { Version v = Version.LUCENE_48; Analyzer analyzer = new Standa

下面是我为匹配lucene索引内容而编写的代码片段。这段代码适用于术语“loop_2;”的查询,但不适用于术语“loop*”的查询。详情如下

我正在努力想办法让它发挥作用:

public class TryLuceneQuery {
   public static void main(String[] args) {

    try {

        Version v = Version.LUCENE_48;
        Analyzer analyzer = new StandardAnalyzer(v);
        Directory fsDir = FSDirectory.open(new File("C:\\data\\index"));

        IndexReader reader = IndexReader.open(fsDir);
        System.out.println("The index has " + reader.maxDoc() + " documents.");
        for(int i=0;i<reader.maxDoc();i++) {
            Document d = reader.document(i);
            System.out.println(d.get("csv"));
        }


        IndexSearcher searcher = new IndexSearcher(reader);

        QueryParser parser 
            = new QueryParser("csv",analyzer);

        Query finalQuery = new TermQuery(new Term("csv","loop_"));

        TopDocs hits = searcher.search(finalQuery,500);
        System.out.println(hits.totalHits + " documents found.");
        ScoreDoc[] scoreDocs = hits.scoreDocs;

        for (int n = 0; n < scoreDocs.length; ++n) {
            ScoreDoc sd = scoreDocs[n];
            float score = sd.score;
            int docId = sd.doc;
            Document d = searcher.doc(docId);
            String code = d.get("csv");
            System.out.println(code);
        }

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}
}


我应该如何查询以匹配“loop*”?谢谢。

您的问题是分析仪<代码>标准分析器尝试从全文内容中创建有意义的单词。通常,标点符号被视为单词之间的分隔符,并从索引中的术语中删除。“loop_”之所以有效,是因为下划线的处理方式有时与大多数其他标点符号不同(例如,当在数字中找到句点和逗号时,请参见)

因此,当您使用StandardAnalyzer为这些字段编制索引时,您会得到以下标记:

  • 循环'loop','loop','loop','loop'
  • loop_uuo“循环”、“循环”、“循环”、“循环”
手动构造的
TermQuery
不受分析器的约束,因此它正在寻找一个文本术语“loop*”,它在索引中根本不存在

听起来你想要的是简单地在空格处分解术语。要做到这一点,您只需使用,并重新索引您的文档

那么你应该看到:

  • 新术语查询(新术语(“csv”、“循环”)=>1个文档
  • 新术语查询(新术语(“csv”、“循环*”))=>1个文档
  • 新术语查询(新术语(“csv”、“循环”)=>0个文档
    
您是否尝试过循环\*?请参考以下内容是的,我试过了。如“查询最终查询=新术语查询(新术语(“csv”、“循环*”);”中所述。我不想使用QueryParser.parse(…)。我需要一个查询来做这个。谢谢。将标准分析器更改为空白分析器起作用。
Query finalQuery = new TermQuery(new Term("csv","loop*"));
Query finalQuery = new TermQuery(new Term("csv","loop\\*"));