Lucene索引搜索没有停止

时间:2017-01-11 22:45:40

标签: search lucene lucene.net

我正在对Lucene索引进行一些查询,现在我正在寻找关于此查询的拉丁短语。问题是这些短语中的一些包括我认为像塞子一样的词。例如,如果我的搜索词是“相反的感觉”,结果为零,但如果我只搜索“相反的感觉”,我有超过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构建索引并执行搜索

2 个答案:

答案 0 :(得分:0)

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

  

Rubro:“?contrario sensu”

该问号表示位置增量,在这种情况下是一个删除的停止词。所以它正在寻找一个带有间隙的短语,其中一开始就删除了一个停用词。

您可以使用QueryParser.setEnablePositionIncrements(false)在查询解析器中禁用位置增量,但是您应该知道如果索引中仍有位置增量,这可能会导致问题,并在中间遇到停止词一句话。

答案 1 :(得分:0)

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

查询时的分析样式与索引时使用的样式兼容非常重要。这就是为什么你的PhraseQuery只能在没有&#34; a&#34;因为索引步骤将其删除。

您可以使用带有ISet<string> stopWords的StandardAnalyzer ctor并传入new HashSet<string>()类似的内容:

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

这意味着所有字词将包含在该字段的令牌流中。

在建立索引和查询时使用此分析器,您将获得更好的结果。

但是,你应该注意到,StandardAnalyzer也会略微提出一些措辞。它被设计成为大多数欧洲语言文档的良好标记符&#34;。请参阅https://github.com/apache/lucenenet/blob/3.0.3-2/src/core/Analysis/Standard/StandardTokenizer.cs开头的评论,了解更多信息,并检查它是否与您的使用案例兼容。

您可能值得花些时间研究不同的分析器,以了解您要编制索引的文本类型。