[英]Lucene.net cant search “.net”
Q1:我正在使用Lucene进行搜索。 一切正常且快速。 当我尝试搜索短语“ .net”时,它什么也没找到。 也许您知道我该如何应对。
Q2:如何搜索并忽略大小写?
更新1
Q1:我正在使用SimpleLucene节省工作。 这是代码:
DirectoryIndexWriter _indexWriter = new DirectoryIndexWriter(new DirectoryInfo(indexPath), true);
using (var indexService = new IndexService(_indexWriter))
{
var result = indexService.IndexEntities(jobsTempArray, new JobIndexDefinition());
Console.WriteLine("{0} products indexed in {1} milliseconds.", result.Count, result.ExecutionTime);
}
JobIndexDefinition文件:
public class JobIndexDefinition : IIndexDefinition<LucenceJobModel>
{
public Document Convert(LucenceJobModel job)
{
var document = new Document();
document.Add(new Field("jobtitle", job.JobTitle, Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("AreaCode", job.AreaCode.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Company", job.Company, Field.Store.YES, Field.Index.NOT_ANALYZED));
var dateValue = DateTools.DateToString(job.DatePosted.Value, DateTools.Resolution.MILLISECOND);
document.Add(new Field("DatePosted", dateValue, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Description", job.Description, Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("Expierence", job.Expierence, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("JobType", job.JobType, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Link", job.Link, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("LinkId", job.LinkId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Location", job.Location, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("PayRate", job.PayRate, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Source", job.Source, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("TaxTerm", job.TaxTerm, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Term", job.Term, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Title", job.Title, Field.Store.YES, Field.Index.NOT_ANALYZED));
return document;
}
public Term GetIndex(LucenceJobModel job)
{
return new Term("Link", job.Link);
}
}
我正在搜索JobTitle,Description和DatePosted字段。 这是搜索代码:
public List<LucenceJobModel> JobsSearch(string keyword, string location, PageInfo pageInfo)
{
string[] words = keyword.Split(new[] { ' ' });
IndexReader reader = IndexReader.Open(SmartSearch.Instance.GetDirectory(), true);
var searcher = new IndexSearcher(reader);
var standardAnalyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
var fields = new[] { "JobTitle", "Description", "DatePosted" };
var searchQuery = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, fields, standardAnalyzer);
//searchQuery.SetAllowLeadingWildcard(true);
// perform the search
var query = new BooleanQuery();
foreach (var word in words)
{
if (!String.IsNullOrEmpty(word))
{
var qTemp = searchQuery.Parse(word);
var q = searchQuery.Parse(qTemp.ToString().Substring(qTemp.ToString().LastIndexOf(":") + 1) + "*");
query.Add(q, BooleanClause.Occur.MUST);
}
}
int maxDocs = 1;
if (reader.MaxDoc() > 0)
maxDocs = reader.MaxDoc();
var results = searcher.Search(query, filter, maxDocs);
foreach (var scoreDoc in results.scoreDocs)
{
var document = searcher.Doc(scoreDoc.doc);
}
var jobs = new List<LucenceJobModel>();
for (int i = 0; i < results.scoreDocs.Length; i++)
{
var document = searcher.Doc(results.scoreDocs[i].doc);
if (i >= (pageInfo.CurrentPage - 1) * pageInfo.ItemsPerPage && i < pageInfo.CurrentPage * pageInfo.ItemsPerPage)
{
jobs.Add(LucenceJobModel.ConvertFromDoc(document));
}
itemsForGroup.Add(new ItemGroupFor
{
Company = document.GetField("Company").StringValue(),
DatePosted = DateTools.StringToDate(document.GetField("DatePosted").StringValue()),
JobType = document.GetField("JobType").StringValue(),
Location = document.GetField("Location").StringValue(),
Source = document.GetField("Source").StringValue(),
Title = document.GetField("Title").StringValue()
});
}
pageInfo.TotalItems = results.scoreDocs.Length;
return jobs;
}
我希望能够搜索诸如“ C#”或“ .net”之类的关键字,而不删除“#”或“。”。
Q2:我在位置字段中搜索。 这是代码:
public List<string> GetLocations(string term)
{
IndexReader reader = IndexReader.Open(SmartSearch.Instance.GetDirectory(), true);
var searcher = new IndexSearcher(reader);
var standardAnalyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "Location", standardAnalyzer);
string str = parser.Parse(term).ToString().Substring(parser.Parse(term).ToString().LastIndexOf(":") + 1);
PrefixQuery q = new PrefixQuery(new Term("Location", string.Format("{0}", str)));
TopDocs results = searcher.Search(q, 5000);
return results
.scoreDocs
.Select(x => searcher.Doc(x.doc))
.Select(x => x.GetField("Location").StringValue())
.Distinct()
.ToList();
}
我想搜索“纽约”,“纽约”等。 但是我知道只有在情况正确的情况下它才会搜索。
我不熟悉“ SimpleLucene”,但是您的代码看起来比需要的复杂得多。
一些东西:
字段名称区分大小写,您将作业标题存储为“ jobtitle”,但使用“ JobTitle”进行搜索。 他们需要匹配。
您提到要搜索DatePosted和Location字段,但是在您发布的代码中它们是“ NOT_ANALYZED”。 如果要搜索这些字段,请将其更改为“ ANALYZED”。
如果要保留“ .net”和“ C#”之类的术语,请尝试使用空白分析器。 请记住,空格分析器不使用小写过滤器,因此搜索“ .NET”将不匹配“ .net”。 您可能必须编写自己的分析器。
解答1:所有内置的分析器(关键字和空格除外)都去除了术语中的句点,因此搜索以下内容无关紧要:“ net”,“。net”,“。net”,... net ...”等。如果不是这种情况,则还有另一个问题。发布一些代码,也许我们可以提供帮助。
如果您需要匹配“ .net”和“ C#”之类的术语,那么使用Whitespace Analyzer可能会更好。 如果这不能满足您的需求,则可能必须编写自己的分析器。
解答2:标准分析器会自动将大写转换为小写,因此您已经忽略了大小写。
从上面的页面:
分析:“敏捷的棕色狐狸跳过了懒狗”
org.apache.lucene.analysis.WhitespaceAnalyzer:
[The] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
org.apache.lucene.analysis.SimpleAnalyzer:
[the] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
org.apache.lucene.analysis.StopAnalyzer:
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
org.apache.lucene.analysis.standard.StandardAnalyzer:
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
org.apache.lucene.analysis.snowball.SnowballAnalyzer:
[quick] [brown] [fox] [jump] [over] [lazi] [dog]
分析“ XY&Z公司-xyz@example.com”
org.apache.lucene.analysis.WhitespaceAnalyzer:
[XY&Z] [Corporation] [-] [xyz@example.com]
org.apache.lucene.analysis.SimpleAnalyzer:
[xy] [z] [corporation] [xyz] [example] [com]
org.apache.lucene.analysis.StopAnalyzer:
[xy] [z] [corporation] [xyz] [example] [com]
org.apache.lucene.analysis.standard.StandardAnalyzer:
[xy&z] [corporation] [xyz@example] [com]
org.apache.lucene.analysis.snowball.SnowballAnalyzer:
[xy&z] [corpor] [xyz@exampl] [com]
A1:
这听起来很合理,因为您不会使用与查询相同的Analyzer
/ Tokenizer
进行索引。
您需要确保同一字段两者都相同。 例如
如果术语.net
是在索引时生成的,并且您的查询分析器删除了点,它将找不到任何东西。
A2: StandardAnalyzer应该注意这一点
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.