Je suis très nouveau sur lucene.net. J'ai écrit cette application de console simple en C# qui indexe certaines données fausses. J'ai alors voulu pouvoir rechercher l'index pour divers termes using un booleanquery.Lucene.Net qu'est-ce que je fais mal?
Je n'ai jamais aucun résultat. Voici le code. Toute aide serait grandement appréciée. Merci.
static void Main(string[] args)
{
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriter writer = new IndexWriter("Test", analyzer, true);
Console.WriteLine("Creating index");
for (int i = 0; i < 1500; i++)
{
Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document();
doc.Add(new Lucene.Net.Documents.Field("A", i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO));
doc.Add(new Lucene.Net.Documents.Field("B", "LALA" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO));
doc.Add(new Lucene.Net.Documents.Field("C", "DODO" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO));
doc.Add(new Lucene.Net.Documents.Field("D", i.ToString() + " MMMMM", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO));
writer.AddDocument(doc);
}
writer.Optimize();
writer.Close();
BooleanQuery query = new BooleanQuery();
query.Add(new WildcardQuery(new Term("B", "lala*")), Lucene.Net.Search.BooleanClause.Occur.MUST);
query.Add(new WildcardQuery(new Term("C", "DoDo1*")), Lucene.Net.Search.BooleanClause.Occur.MUST);
IndexSearcher searcher = new IndexSearcher("Test");
Hits hits = searcher.Search(query);
if (hits.Length() > 0)
{
for (int i = 0; i < hits.Length(); i++)
{
Console.WriteLine("{0} - {1} - {2} - {3}",
hits.Doc(i).GetField("A").StringValue(),
hits.Doc(i).GetField("B").StringValue(),
hits.Doc(i).GetField("C").StringValue(),
hits.Doc(i).GetField("D").StringValue());
}
}
searcher.Close();
Console.WriteLine("Done");
Console.ReadLine();
}
Je puis ai eu à travailler en utilisant MultiFieldQueryParser comme ceci:
static void Main(string[] args)
{
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriter writer = new IndexWriter("Test", analyzer, true);
Console.WriteLine("Creating index");
for (int i = 0; i < 1500; i++)
{
Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document();
doc.Add(new Lucene.Net.Documents.Field("A", i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED));
doc.Add(new Lucene.Net.Documents.Field("B", "LALA" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED));
doc.Add(new Lucene.Net.Documents.Field("C", "DODO" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED));
doc.Add(new Lucene.Net.Documents.Field("D", i.ToString() + " MMMMM", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED));
writer.AddDocument(doc);
}
writer.Optimize();
writer.Close();
BooleanQuery.SetMaxClauseCount(5000);
Query query = MultiFieldQueryParser.Parse(new string[] { "LALA*", "DODO*" }, new string[] { "B", "C" }, analyzer);
IndexSearcher searcher = new IndexSearcher("Test");
Hits hits = searcher.Search(query);
if (hits.Length() > 0)
{
for (int i = 0; i < hits.Length(); i++)
{
Console.WriteLine("{0} - {1} - {2} - {3}",
hits.Doc(i).GetField("A").StringValue(),
hits.Doc(i).GetField("B").StringValue(),
hits.Doc(i).GetField("C").StringValue(),
hits.Doc(i).GetField("D").StringValue());
}
}
searcher.Close();
Console.WriteLine("Done");
Console.ReadLine();
}
Ceci est probablement le meilleur article que j'ai trouvé pour les nouveaux développeurs Lucene: http://www.ifdefined.com/blog/post/2009/02/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx
Je tokenized le champ A et re-couru l'application. Il n'a toujours pas retourné de résultats. – dnoxs
D'autres suggestions? Merci pour votre réponse rapide. – dnoxs
Vous pouvez uniquement effectuer une recherche sur des champs indexés. Vous devez donc également indexer les champs "B" et "C". –