当前位置: 首页 > 知识库问答 >
问题:

在StandardAnalyzer中使用StopWords进行Lucene

谭嘉容
2023-03-14

我在使用Lucene.NET 3.0.3时遇到以下问题。

using (StandardAnalyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30, roxConnectionTools.getServiceInstance<ISearchIndexService>().GetStopWordList()))
{
    ...
    MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, searchFields, analyzer);
    parser.MultiTermRewriteMethod = MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE;
    parser.AllowLeadingWildcard = true;
    ...
    Query searchQuery = parser.Parse(searchStringBuilder.ToString().Trim);
    ...
    BooleanQuery boolQuery = new BooleanQuery();
    boolQuery.Add(searchQuery, Occur.MUST);
    ...
    TopScoreDocCollector scoreCollector = TopScoreDocCollector.Create(SearchServiceTools.MAX_SCORE_COLLECTOR_SIZE, true);
    ...
    searcher.Search(boolQuery, scoreCollector);
    ScoreDoc[] scoreDocs = scoreCollector.TopDocs().ScoreDocs;
}

我的搜索查询如下所示:
手动生成的搜索查询:(+*test*+*und*+*produktivumgebung*)
解析的搜索查询:+(标题:*test*)+(标题:*und*)+(标题:*produktivumgebung*)

为什么我找不到搜索“test-und produktivumgebung”的文档?

共有1个答案

沃楷
2023-03-14

不分析通配符查询(有关示例,请参见此问题)。因为您(如果我理解正确的话)正在将查询“test-und produktivumgebung”解释为(+*test*+*und*+*produktivumgebung*),所以分析器不会用于任何通配符查询,并且停止词不会被删除。

如果取消执行转换的步骤,查询“test-und produktivumgebung”应该会被解析为短语查询并进行分析,并且应该能正常工作。取消这一步骤的另一个原因是,对每个术语应用前导通配符将导致性能变得非常差。这就是为什么必须手动启用前导通配符,因为使用它们通常是个坏主意。

 类似资料:
  • 这是最复杂的分析器,能够处理名称,电子邮件地址等。它会降低每个令牌的大小,并删除常用的单词和标点符号(如果有的话)。 Class 声明 (Class Declaration) 以下是org.apache.lucene.analysis.StandardAnalyzer类的声明 - public final class StandardAnalyzer extends StopwordAnal

  • 停用词是英语单词,对句子没有多大意义。 在不牺牲句子含义的情况下,可以安全地忽略它们。 例如,像,他,等等的单词已经在名为语料库的语料库中捕获了这些单词。 我们首先将它下载到我们的python环境中。 import nltk nltk.download('stopwords') 它将下载带有英语停用词的文件。 验证停用词 from nltk.corpus import stopwords sto

  • 问题内容: 我想一个添加到我的。我的意图是从我索引的所有文本中删除标点符号;例如,我希望PrefixQuery“ pf”匹配“ PF Chang’s”或“ zaras”匹配“ Zara’s”。 看来,最简单的攻击方法是在分析之前过滤掉所有标点符号。根据Analyzer的文档包,这意味着我应该使用。 但是,实际上几乎不可能将a 插入分析仪! JavaDoc for Analyzer.initRead

  • 问题内容: 我有一组一对一的映射A->苹果,B->香蕉,等等。我的表中有一列的值为A,B,C。 现在,我正在尝试使用选择语句,这将给我直接结果 但是我没有得到正确的结果,请帮助我。 问题答案: 这只是case语句的语法,看起来像这样。 提醒一下;不执行赋值,该值成为列内容。(如果您想将其分配给变量,则可以将其放在CASE语句之前)。

  • 问题内容: 我想在Java中使用JSON进行简单的HTTP POST。 假设网址是 并采用标记为例如的值。 我将如何为POST创建语法? 我似乎也无法在JSON Javadocs中找到POST方法。 问题答案: 这是你需要做的: 获取Apache HttpClient,这将使你能够发出所需的请求 使用它创建一个HttpPost请求,并添加标题“ application / x-www-form-u

  • 问题内容: 我在Titan上使用Elastic Search。如何用泰坦在ES中进行分页? 我看到了这个,所以尝试了这个: 事情是它返回所有4-5个记录,而不是2的大小 问题答案: 参数尚不支持。该方法仅存在于将来的实现中。但是,您目前可以限制结果。下面的代码应该工作: …但是您不能指定偏移量。 干杯,丹尼尔