我正在对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构建索引并执行搜索
答案 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开头的评论,了解更多信息,并检查它是否与您的使用案例兼容。
您可能值得花些时间研究不同的分析器,以了解您要编制索引的文本类型。