繁体   English   中英

Lucene.net无法搜索“ .net”

[英]Lucene.net cant search “.net”

Q1:我正在使用Lucene进行搜索。 一切正常且快速。 当我尝试搜索短语“ .net”时,它什么也没找到。 也许您知道我该如何应对。

Q2:如何搜索并忽略大小写?

更新1

Q1:我正在使用SimpleLucene节省工作。 这是代码:

DirectoryIndexWriter _indexWriter = new DirectoryIndexWriter(new DirectoryInfo(indexPath), true);
using (var indexService = new IndexService(_indexWriter))
{
   var result = indexService.IndexEntities(jobsTempArray, new JobIndexDefinition());
   Console.WriteLine("{0} products indexed in {1} milliseconds.", result.Count, result.ExecutionTime);
}

JobIndexDefinition文件:

public class JobIndexDefinition : IIndexDefinition<LucenceJobModel>
{
    public Document Convert(LucenceJobModel job)
    {
        var document = new Document();

        document.Add(new Field("jobtitle", job.JobTitle, Field.Store.YES, Field.Index.ANALYZED));
        document.Add(new Field("AreaCode", job.AreaCode.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("Company", job.Company, Field.Store.YES, Field.Index.NOT_ANALYZED));
        var dateValue = DateTools.DateToString(job.DatePosted.Value, DateTools.Resolution.MILLISECOND);
        document.Add(new Field("DatePosted", dateValue, Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("Description", job.Description, Field.Store.YES, Field.Index.ANALYZED));
        document.Add(new Field("Expierence", job.Expierence, Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("JobType", job.JobType, Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("Link", job.Link, Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("LinkId", job.LinkId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("Location", job.Location, Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("PayRate", job.PayRate, Field.Store.YES, Field.Index.NOT_ANALYZED));

        document.Add(new Field("Source", job.Source, Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("TaxTerm", job.TaxTerm, Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("Term", job.Term, Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("Title", job.Title, Field.Store.YES, Field.Index.NOT_ANALYZED));

        return document;
    }

    public Term GetIndex(LucenceJobModel job)
    {
        return new Term("Link", job.Link);
    }
}

我正在搜索JobTitle,Description和DatePosted字段。 这是搜索代码:

public List<LucenceJobModel> JobsSearch(string keyword, string location, PageInfo pageInfo)
{
    string[] words = keyword.Split(new[] { ' ' });

    IndexReader reader = IndexReader.Open(SmartSearch.Instance.GetDirectory(), true);
    var searcher = new IndexSearcher(reader);

    var standardAnalyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
    var fields = new[] { "JobTitle", "Description", "DatePosted" };

    var searchQuery = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, fields, standardAnalyzer);
    //searchQuery.SetAllowLeadingWildcard(true);

    // perform the search
    var query = new BooleanQuery();

    foreach (var word in words)
    {
        if (!String.IsNullOrEmpty(word))
        {
            var qTemp = searchQuery.Parse(word);
            var q = searchQuery.Parse(qTemp.ToString().Substring(qTemp.ToString().LastIndexOf(":") + 1) + "*");
            query.Add(q, BooleanClause.Occur.MUST);
        }
    }

    int maxDocs = 1;
    if (reader.MaxDoc() > 0)
        maxDocs = reader.MaxDoc();

    var results = searcher.Search(query, filter, maxDocs);
    foreach (var scoreDoc in results.scoreDocs)
    {
        var document = searcher.Doc(scoreDoc.doc);
    }

    var jobs = new List<LucenceJobModel>();
    for (int i = 0; i < results.scoreDocs.Length; i++)
    {
        var document = searcher.Doc(results.scoreDocs[i].doc);
        if (i >= (pageInfo.CurrentPage - 1) * pageInfo.ItemsPerPage && i < pageInfo.CurrentPage * pageInfo.ItemsPerPage)
        {
            jobs.Add(LucenceJobModel.ConvertFromDoc(document));
        }

        itemsForGroup.Add(new ItemGroupFor
            {
                Company = document.GetField("Company").StringValue(),
                DatePosted = DateTools.StringToDate(document.GetField("DatePosted").StringValue()),
                JobType = document.GetField("JobType").StringValue(),
                Location = document.GetField("Location").StringValue(),
                Source = document.GetField("Source").StringValue(),
                Title = document.GetField("Title").StringValue()
            });
    }

    pageInfo.TotalItems = results.scoreDocs.Length;
    return jobs;
}

我希望能够搜索诸如“ C#”或“ .net”之类的关键字,而不删除“#”或“。”。

Q2:我在位置字段中搜索。 这是代码:

public List<string> GetLocations(string term)
{
    IndexReader reader = IndexReader.Open(SmartSearch.Instance.GetDirectory(), true);
    var searcher = new IndexSearcher(reader);

    var standardAnalyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
    QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "Location", standardAnalyzer);
    string str = parser.Parse(term).ToString().Substring(parser.Parse(term).ToString().LastIndexOf(":") + 1);

    PrefixQuery q = new PrefixQuery(new Term("Location", string.Format("{0}", str)));

    TopDocs results = searcher.Search(q, 5000);

    return results
                .scoreDocs
                .Select(x => searcher.Doc(x.doc))
                .Select(x => x.GetField("Location").StringValue())
                .Distinct()
                .ToList();
}

我想搜索“纽约”,“纽约”等。 但是我知道只有在情况正确的情况下它才会搜索。

我不熟悉“ SimpleLucene”,但是您的代码看起来比需要的复杂得多。

一些东西:

字段名称区分大小写,您将作业标题存储为“ jobtitle”,但使用“ JobTitle”进行搜索。 他们需要匹配。

您提到要搜索DatePosted和Location字段,但是在您发布的代码中它们是“ NOT_ANALYZED”。 如果要搜索这些字段,请将其更改为“ ANALYZED”。

如果要保留“ .net”和“ C#”之类的术语,请尝试使用空白分析器。 请记住,空格分析器不使用小写过滤器,因此搜索“ .NET”将不匹配“ .net”。 您可能必须编写自己的分析器。

解答1:所有内置的分析器(关键字和空格除外)都去除了术语中的句点,因此搜索以下内容无关紧要:“ net”,“。net”,“。net”,... net ...”等。如果不是这种情况,则还有另一个问题。发布一些代码,也许我们可以提供帮助。

如果您需要匹配“ .net”和“ C#”之类的术语,那么使用Whitespace Analyzer可能会更好。 如果这不能满足您的需求,则可能必须编写自己的分析器。

解答2:标准分析器会自动将大写转换为小写,因此您已经忽略了大小写。

此页面提供了各种分析器对短语所做的很好的示例。

从上面的页面:

分析:“敏捷的棕色狐狸跳过了懒狗”

org.apache.lucene.analysis.WhitespaceAnalyzer:
    [The] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs] 

org.apache.lucene.analysis.SimpleAnalyzer:
    [the] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs] 

org.apache.lucene.analysis.StopAnalyzer:
    [quick] [brown] [fox] [jumped] [over] [lazy] [dogs] 

org.apache.lucene.analysis.standard.StandardAnalyzer:
    [quick] [brown] [fox] [jumped] [over] [lazy] [dogs] 

org.apache.lucene.analysis.snowball.SnowballAnalyzer:
    [quick] [brown] [fox] [jump] [over] [lazi] [dog] 

分析“ XY&Z公司-xyz@example.com”

   org.apache.lucene.analysis.WhitespaceAnalyzer:
        [XY&Z] [Corporation] [-] [xyz@example.com] 

    org.apache.lucene.analysis.SimpleAnalyzer:
        [xy] [z] [corporation] [xyz] [example] [com] 

    org.apache.lucene.analysis.StopAnalyzer:
        [xy] [z] [corporation] [xyz] [example] [com] 

    org.apache.lucene.analysis.standard.StandardAnalyzer:
        [xy&z] [corporation] [xyz@example] [com] 

    org.apache.lucene.analysis.snowball.SnowballAnalyzer:
        [xy&z] [corpor] [xyz@exampl] [com] 

A1:

这听起来很合理,因为您不会使用与查询相同的Analyzer / Tokenizer进行索引。

您需要确保同一字段两者都相同。 例如

如果术语.net是在索引时生成的,并且您的查询分析器删除了点,它将找不到任何东西。

A2: StandardAnalyzer应该注意这一点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM