【问题标题】:How to create own analyzer using Whitespaceanalyzer and LowerCase filter in Lucene.Net?如何在 Lucene.Net 中使用 Whitespaceanalyzer 和 LowerCase 过滤器创建自己的分析器?
【发布时间】:2013-07-27 07:47:00
【问题描述】:

在我的情况下,我需要搜索 C#、.Net、C++..etc 等关键字,其中标准分析器会去除特殊字符,所以我使用了空白分析器,它对我不起作用。 索引时:

public void Indexing(DataSet ds)
{
        string indexFileLocation = @"D:\Lucene.Net\Data";
        Lucene.Net.Store.Directory dir = Lucene.Net.Store.FSDirectory.GetDirectory(indexFileLocation, true);
        IndexWriter indexWriter = new IndexWriter(dir, new WhitespaceAnalyzer(), Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
        if (ds.Tables[0] != null)
        {
            DataTable dt = ds.Tables[0];
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow dr in dt.Rows)
               {
                    //Create the Document object
                    Document doc = new Document();

                    foreach (DataColumn dc in dt.Columns)
                    {
                        string check = dc.ToString();

                        if (check.Equals("Skill_Summary"))
                        {
                            doc.Add(new Field(dc.ColumnName, dr[dc.ColumnName].ToString(), Field.Store.YES, Field.Index.ANALYZED));
                        }
                        if (check.Equals("Title"))
                        {
                            doc.Add(new Field(dc.ColumnName, dr[dc.ColumnName].ToString(), Field.Store.YES, Field.Index.ANALYZED));
                        }
                    }
                    // Write the Document to the catalog
                    indexWriter.AddDocument(doc);
                }
            }
        }
        // Close the writer
        indexWriter.Close();
    }

并像这样搜索字段:

string[] searchfields = new string[] { "Skill_Summary", "Title" };
var parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, searchfields, new WhitespaceAnalyzer());
string searchText = "C#";

//Split the search string into separate search terms by word
string[] terms = searchText.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
foreach (string term in terms)
{
    finalQuery.Add(parser.Parse(term.Replace("*", "") + "*"), BooleanClause.Occur.MUST);
}
hits = searcher.Search(finalQuery);

在我的情况下,如何使用 Whitespaceanalyzer 和 LowerCase 过滤器构建自己的分析器?

【问题讨论】:

    标签: c# lucene lucene.net


    【解决方案1】:

    在我的情况下,如何使用 Whitespaceanalyzer 和 LowerCase 过滤器构建自己的分析器?

    public class CaseInsensitiveWhitespaceAnalyzer : Analyzer
    {
        /// <summary>
        /// </summary>
        public override TokenStream TokenStream(string fieldName, TextReader reader)
        {
            TokenStream t = null;
            t = new WhitespaceTokenizer(reader);
            t = new LowerCaseFilter(t);
    
            return t;
        }
    }
    

    PS:当您使用通配符(?,*)时,查询解析器不使用任何分析器,只使用您的术语的小写形式(取决于 QueryParser.小写扩展项)

    【讨论】:

    • 感谢@I4V,它通过在技能摘要周围留下空格,就像这样{例如:C#,.Net,java。 } 但用户插入了 {eg:C#,.net,java}(不带空格)之类的数据,我需要向用户视图显示确切的短语,所以我需要通过 (,) 分割和搜索单词这可能吗?
    • 代替 WhitespaceTokenizer,你可以试试 LowerCaseTokenizerStandardTokenizer,这是另一种选择 lucenenet.apache.org/docs/3.0.3/d6/d51/_analysis_8_ext_8cs.html
    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2010-11-07
    • 2020-09-20
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多