使用带有特殊字符的字符串搜索记录在Lucene.Net中不起作用

问题描述 投票:0回答:1

我是Lucene的新手,在这里,lecene搜索面临着严重的问题。使用带数字的字符串搜索记录时,它工作正常。但是,使用带有特殊字符的字符串搜索记录时不会带来任何结果。

ex: example - Brings results 
    'examples' - no result
    %example% - no result
    example2 - Brings results 
    @example - no  results

代码:

索引;

_document.Add(new Field(dc.ColumnName, dr[dc.ColumnName].ToString(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));

搜索查询:

Lucene.Net.Store.Directory _dir = Lucene.Net.Store.FSDirectory.Open(Config.Get(directoryPath));
Lucene.Net.Analysis.Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

Query querySearch = queryParser.Parse("*" + searchParams.SearchForText + "*");
booleanQuery.Add(querySearch, Occur.MUST);

谁能帮我解决这个问题。

c# .net lucene lucene.net
1个回答
0
投票

似乎有工作要做。我敦促获得有关Lucene的入门书籍,例如Lucene in Action,第二版(因为您使用的是版本3)。尽管它的目标是Java示例,但很容易适应C#,但实际上这些概念才是最重要的。

首先,这:

“ *” + searchParams.SearchForText +“ *”

不要这样做。领先的通配符搜索效率极低,并且会在相当大的索引上占用大量资源。

似乎还比发布的代码中显示的要多,因为没有理由不根据输入获得匹配。下面的代码段将在控制台中产生以下内容:

索引:%example%'example'示例@example example2

索引字词:例example2

原始文本%example%作为查询文本:示例获得1次匹配原始文字'example'作为查询文字:示例获得1次匹配原始文本示例作为查询文本:示例获得1次匹配原始文字@example作为查询文字:示例获得1次匹配原始文本example2作为查询文本:example2获得1次匹配通配符原始文本示例*作为查询文本:示例*获得1个匹配项

请参阅索引条款列表?没有[特殊字符]进入索引,因为StandardAnalyzer会在索引时间将它们删除-假设StandardAnalyzer用于对字段进行索引?

我建议在调试器中运行下面的代码片段,然后观察发生了什么。

public static void Example() 
{
    var field_name = "text";
    var field_value = "%example% 'example' example @example example2";
    var luceneVer = Lucene.Net.Util.Version.LUCENE_30;

    using (var writer = new IndexWriter(new RAMDirectory(),
            new StandardAnalyzer(luceneVer), IndexWriter.MaxFieldLength.UNLIMITED)
            )
    {
        var doc = new Document();
        var field = new Field(
            field_name,
            field_value,
            Field.Store.YES,
            Field.Index.ANALYZED,
            Field.TermVector.YES
            );

        doc.Add(field);
        writer.AddDocument(doc);
        writer.Commit();

        Console.WriteLine("Indexed: {0}", field_value);
        Console.WriteLine();
        // Show ALL terms in the index.
        using (var reader = writer.GetReader())
        {
            TermEnum terms = reader.Terms();
            Console.WriteLine("Index terms:");
            while (terms.Next())
            {
                Console.WriteLine("\t{0}", terms.Term.Text);
            }
        }

        // Search for each word in the original content @field_value
        using (var searcher = new IndexSearcher(writer.GetReader()))
        {
            string query_text;
            QueryParser parser;
            Query query; 
            TopDocs topDocs;                 
            List<string> field_queries = new List<string>(field_value.Split(' '));
            var analyzer = new StandardAnalyzer(luceneVer);
            while (field_queries.Count > 0)
            {
                query_text = field_queries[0];
                parser = new QueryParser(luceneVer, field_name, analyzer);
                query = parser.Parse(query_text);
                topDocs = searcher.Search(query, null, 100);
                Console.WriteLine();
                Console.WriteLine("raw text {0} as query {1} got {2} hit(s)",
                    query_text,
                    query,
                    topDocs.TotalHits
                    );                        
                field_queries.RemoveAt(0);
            }

            // Now do a wildcard query "example*"
            query_text = "example*";
            parser = new QueryParser(luceneVer, field_name, analyzer);
            query = parser.Parse(query_text);
            topDocs = searcher.Search(query, null, 100);
            Console.WriteLine();
            Console.WriteLine("Wildcard raw text {0} as query {1} got {2} hit(s)",
                query_text,
                query,
                topDocs.TotalHits
                );                                                        
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.