【问题标题】:C# - Lucene search is not working for few string literalsC# - Lucene 搜索不适用于少数字符串文字
【发布时间】:2015-11-09 11:21:09
【问题描述】:

我们已经使用 Apache lucene 实现了搜索搜索课程。它工作正常。但是,我有 2 条记录,即“让它成为人员”和“做正确的事”。当我搜索“make”“personnel”时,我得到了结果,但是当我搜索“make it”时,没有找到结果。但它适用于“做”!我真的很困惑为什么它不适用于“make it”。 BTW 查询解析器定义如下,

private readonly StandardAnalyzer _analyzer;
_analyzer = new StandardAnalyzer(Version.LUCENE_29);
var parser = new MultiFieldQueryParser(Version.LUCENE_29, new[] { "Name",     "Description", "Id" }, _analyzer);

var queryParser = parseQuery(BuildPrefixQuery(input), parser);

var hits = searcher.Search(queryParser, null, 50, Sort.RELEVANCE).ScoreDocs;

&和索引创建代码是

public void CreateIndex(List<ILucenceProperties> ListILucenceProperties)
    {
var writer = new IndexWriter(_directory, _analyzer, true,     IndexWriter.MaxFieldLength.UNLIMITED);

        foreach (var iLucenceProperties in ListILucenceProperties)
        {
            var document = new Document();

            document.Add(new Field("Id", iLucenceProperties.Id, Field.Store.YES, Field.Index.ANALYZED));
            document.Add(new Field("Name", iLucenceProperties.Name, Field.Store.YES, Field.Index.ANALYZED));
            document.Add(new Field("Description", iLucenceProperties.Description, Field.Store.YES, Field.Index.ANALYZED));
            document.Add(new Field("Category", iLucenceProperties.Category, Field.Store.YES, Field.Index.NO));
            document.Add(new Field("FilterID", iLucenceProperties.FilterID, Field.Store.YES, Field.Index.NO));
            document.Add(new Field("ColumnName", iLucenceProperties.ColumnName, Field.Store.YES, Field.Index.NO));
            document.Add(new Field("AdditionalSearchParameter", iLucenceProperties.AdditionalSearchParameter, Field.Store.YES, Field.Index.NO));
            writer.AddDocument(document);
        }

        writer.Optimize();
        writer.Dispose();
    }

如上,“Name”字段当然包含name,“Id”当然包含id,“Description”当然包含另一个id等等。

我认为问题可能出在解析器/分析器上。请帮帮我。

【问题讨论】:

  • 我认为我们需要查看更多代码,特别是实际匹配查询的代码,甚至可能向我们展示这些关键字所在的一些真实(如果可能)示例数据实际正在使用。

标签: c# .net apache lucene lucene.net


【解决方案1】:

StandardAnalyzer 过滤掉停用词,例如“it”。但是当您搜索时,您将“它”作为关键字包含在内。您可以使用 StandardAnalyzer constructor 获取停用词列表,并使用空集调用它。

【讨论】:

  • 超级!谢谢你。以下更改有效。 _analyzer = new StandardAnalyzer(Version.LUCENE_29, CharArraySet.EMPTY_SET);
  • 但是对于诸如“html/java 编程”之类的课程,它不起作用。即当特殊字符“\”或“/”是课程名称的一部分时。我们只允许这些特殊字符成为课程名称的一部分。你能帮帮我吗?
  • 您可以尝试转义特殊字符,或尝试其他分词器。见this
  • 是的,如果我们转义特殊字符(以前我们手动用空字符串替换特殊字符)为 Query query = parser.Parse(QueryParser.Escape(searchQuerystr)); (我们的解析器是多字段解析器。)我可以搜索“html/java 编程”但我无法搜索“html/java progr”、“html/java progra”等,即它现在需要完整的单词!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多