Lucene RegexQuery似乎不适用Regex?

时间:2014-07-23 15:03:30

标签: c# asp.net regex lucene

代码:

private static void AddTextToIndex(string filename, string pdfBody, IndexWriter writer)
    {
        Document doc = new Document();
        doc.Add(new Field("fileName", filename.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
        doc.Add(new Field("pdfBody", pdfBody.ToString(), Field.Store.NO, Field.Index.NOT_ANALYZED));
        writer.AddDocument(doc);
    }

protected void txtBoxSearchPDF_Click(object sender, EventArgs e)
{
//some code
    string searchQuery = txtBoxSearchString.Text;
    Term t = new Term("fileName",searchQuery+"/i"); 
    RegexQuery regQuer = new RegexQuery(t);

TopDocs resultDocs = indexSearch.Search(regQuer, indexReader.MaxDoc); 

            var hits = resultDocs.ScoreDocs;
            foreach (var hit in hits)
            {
                var documentFromSearcher = indexSearch.Doc(hit.Doc);
                string getResult = documentFromSearcher.Get("fileName");
                string formattedResult = getResult.Replace(" ", "%20");
                sb.AppendLine(@"<a href=https://de.com.edu/search/COM-Syllabi/" + formattedResult+ ">" + getResult+"</a>");
                sb.AppendLine("<br>");
            }
}

基本上我所要做的就是使用正则表达式以便我可以完全匹配,但我希望搜索不区分大小写。但是添加/i选项实际上并不能使它成为正则表达式,所有它似乎都是将搜索词字面化为在与/i连接的文本框中输入的内容。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

区分大小写主要取决于您使用的Analyzer

RegexQueryMultiTermQuery,这意味着它会被重写为与BooleanQuery类似的内容,其中SHOULD出现在与正则表达式匹配的所有条件上。< / p>

在搜索时,您的索引中的字词将被枚举并与您的正则表达式进行匹配。匹配的字词将作为子句添加到BooleanQuery

您的正则表达式显然无法通过分析器,因此您必须手动调整以符合您的条件。

而且,正则表达式语法不支持许多功能...... See the docs

实际上,我简化了解释,真正发生的事情更复杂,因为发生了许多优化(所有的术语都没有枚举,正则表达式被编译成有限状态自动机,querty不一定被重写为{{ 1}}等)。但幕后发生的事情将与我在此处解释的结果相同。