C# - Lucene 搜索不适用于少数字符串文字
C# - Lucene search is not working for few string literals
我们已经实现了使用 Apache lucene 搜索课程。它工作正常。但是,我有 2 条记录,即 "Make it personnel" 和 "Do it right thing"。当我搜索 "make" "personnel" 时,我得到了结果,但是当我搜索 "make it" 时,没有找到任何结果。但它适用于 "do 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等等。
我认为问题可能出在 parser/analyzer。请帮帮我。
StandardAnalyzer
过滤掉停用词,例如"it"。但是当您搜索时,您会将 "it" 作为关键字包含在内。您可以使用带有停用词列表的 StandardAnalyzer
constructor,并用空集调用它。
我们已经实现了使用 Apache lucene 搜索课程。它工作正常。但是,我有 2 条记录,即 "Make it personnel" 和 "Do it right thing"。当我搜索 "make" "personnel" 时,我得到了结果,但是当我搜索 "make it" 时,没有找到任何结果。但它适用于 "do 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等等。
我认为问题可能出在 parser/analyzer。请帮帮我。
StandardAnalyzer
过滤掉停用词,例如"it"。但是当您搜索时,您会将 "it" 作为关键字包含在内。您可以使用带有停用词列表的 StandardAnalyzer
constructor,并用空集调用它。