【问题标题】:Lucene Index Search without stoppers没有塞子的 Lucene 索引搜索
【发布时间】:2017-01-11 22:45:39
【问题描述】:

我正在对 Lucene 索引进行一些查询,现在我正在寻找针对此查询的拉丁短语。问题是其中一些短语包含我认为像塞子一样的词。例如,如果我的搜索词是“a contrario sensu”,结果为零,但如果我只搜索“contrario sensu”,我有 100 多个巧合。

问题是如果没有这个塞子我怎么能进行搜索?

我的代码是这样的

public IEnumerable<TesisIndx> Search(string searchTerm)
{
        List<TesisIndx> results = new List<TesisIndx>();

        IndexSearcher searcher = new IndexSearcher(FSDirectory.GetDirectory(indexPath));
        QueryParser parser = new QueryParser("Rubro", analyzer);


        PhraseQuery q = new PhraseQuery();
        String[] words = searchTerm.Split(' ');

        foreach (string word in words)
        {
            q.Add(new Term("Rubro", word));
        }

        //Query query = parser.Parse(searchTerm);
        Hits hitsFound = searcher.Search(q);

        TesisIndx sampleDataFileRow = null;

        for (int i = 0; i < hitsFound.Length(); i++)
        {
            sampleDataFileRow = new TesisIndx();
            Document doc = hitsFound.Doc(i);
            sampleDataFileRow.Ius = int.Parse(doc.Get("Ius"));
            sampleDataFileRow.Rubro = doc.Get("Rubro");
            sampleDataFileRow.Texto = doc.Get("Texto");


            results.Add(sampleDataFileRow);
        }
}

我使用 StandardAnalyzer 构建索引并执行搜索

【问题讨论】:

    标签: search lucene lucene.net


    【解决方案1】:

    这是一个停用词。但是,当涉及到短语查询时,这并不意味着它根本不被考虑。如果您在解析后尝试打印查询,您应该会看到如下内容:

    Rubro:“?相反的感觉”

    那个问号代表一个位置增量,在这种情况下是一个删除的停用词。因此,它正在寻找在开头已删除停用词的有间隙的短语。

    您可以在查询解析器中使用QueryParser.setEnablePositionIncrements(false) 禁用位置增量,但您应该知道,如果索引中仍有位置增量,并且在短语中间遇到停用词,这可能会给您带来问题.

    【讨论】:

    • 在解析后打印查询显示 Rubro:"a contrario sensu" 所以至少在那一刻停用词没有被删除。我还将位置增量设置为 false,但根本没有任何变化
    • @danilo_zac - 好吧,你没有展示你如何定义你的分析仪,所以我能做的就是相信你的话。你是给它一个空的停止设置还是类似的?
    • 我只是在做这样的事情来定义分析器 Analyzer analyzer = new StandarAnalyzer();
    • 等一下...仔细看看,您实际上并没有使用您构建的那个 QueryParser。手动构建的PhraseQuery 不会进行任何分析,这当然意味着它不会消除停用词。如果您想自己构建 PhraseQuery,则必须先处理任何分析问题。
    • 我采用 PhraseQuery 的方法,使用 QueryParse 分别查找每个单词,而不是完整的短语,打印解析显示 Rubro:contrario Rubro: sensu 在这种情况下,分析器正在删除停用词
    【解决方案2】:

    StandardAnalyzer 将排除一组停用词,包括“a”(完整列表请参见https://github.com/apache/lucenenet/blob/3.0.3-2/src/core/Analysis/StopAnalyzer.cs 的末尾)

    重要的是查询时的分析风格与索引时使用的风格兼容。这就是为什么您的 PhraseQuery 只能在没有“a”的情况下工作,因为索引步骤删除了它。

    您可以使用采用 ISet&lt;string&gt; stopWords 的 StandardAnalyzer ctor 并传入 new HashSet&lt;string&gt;() 类似的东西:

    new StandardAnalyzer(Version.LUCENE_30, new HashSet<string>())
    

    这意味着所有个单词都将包含在该字段的标记流中。

    在索引和查询时使用这个分析器,你会得到更好的结果。

    但是,您应该注意,StandardAnalyzer 也会对这些词产生一些影响。它旨在成为“大多数欧洲语言文档的良好标记器”。有关更多信息,请参阅https://github.com/apache/lucenenet/blob/3.0.3-2/src/core/Analysis/Standard/StandardTokenizer.cs 开头的 cmets,并检查它是否与您的用例兼容。

    可能值得您花时间针对您要索引的文本类型研究不同的分析器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多