Mam wiele problemów z przechowywaniem danych relacyjnych i Lucene, ale ta, którą masz, powinna być łatwa do naprawienia.
Domyślam się, że tokenize pól grupy i umożliwia wyszukiwanie podłańcuchów w wartości pola. Po prostu dodaj pole niezsynchronizowane i powinno działać tak, jak powinno.
Proszę sprawdzić poniższy kawałek kodu:
internal class Program {
private static void Main(string[] args) {
var directory = new RAMDirectory();
var writer = new IndexWriter(directory, new StandardAnalyzer());
AddDocument(writer, "group", "stuff", Field.Index.UN_TOKENIZED);
AddDocument(writer, "group", "other stuff", Field.Index.UN_TOKENIZED);
writer.Close(true);
var searcher = new IndexSearcher(directory);
Hits hits = searcher.Search(new TermQuery(new Term("group", "stuff")));
for (int i = 0; i < hits.Length(); i++) {
Console.WriteLine(hits.Doc(i).GetField("group").StringValue());
}
}
private static void AddDocument(IndexWriter writer, string name, string value, Field.Index index) {
var document = new Document();
document.Add(new Field(name, value, Field.Store.YES, index));
writer.AddDocument(document);
}
}
Próbka dodaje dwa dokumenty do indeksu, które są untokenized, nie szukaj na rzeczy i dostaje jedno trafienie. Jeśli zmienisz kod, aby dodać je tokenized, będziesz miał dwa trafienia, jak widać teraz.
Problem z używaniem Lucene do relacyjnych danych jest taki, że można oczekiwać, że wyszukiwanie za pomocą symboli wieloznacznych i zakresów zawsze będzie działać. Tak naprawdę nie jest, jeśli indeks jest duży ze względu na sposób, w jaki Lucene rozwiązuje te zapytania.
Inną próbkę do zilustrowania problemu:
private static void Main(string[] args) {
var directory = new RAMDirectory();
var writer = new IndexWriter(directory, new StandardAnalyzer());
var documentA = new Document();
documentA.Add(new Field("name", "A", Field.Store.YES, Field.Index.UN_TOKENIZED));
documentA.Add(new Field("group", "stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
documentA.Add(new Field("group", "other stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.AddDocument(documentA);
var documentB = new Document();
documentB.Add(new Field("name", "B", Field.Store.YES, Field.Index.UN_TOKENIZED));
documentB.Add(new Field("group", "stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.AddDocument(documentB);
var documentC = new Document();
documentC.Add(new Field("name", "C", Field.Store.YES, Field.Index.UN_TOKENIZED));
documentC.Add(new Field("group", "other stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.AddDocument(documentC);
writer.Close(true);
var query1 = new TermQuery(new Term("group", "stuff"));
SearchAndDisplay("First sample", directory, query1);
var query2 = new TermQuery(new Term("group", "other stuff"));
SearchAndDisplay("Second sample", directory, query2);
var query3 = new BooleanQuery();
query3.Add(new TermQuery(new Term("group", "stuff")), BooleanClause.Occur.MUST);
query3.Add(new TermQuery(new Term("group", "other stuff")), BooleanClause.Occur.MUST);
SearchAndDisplay("Third sample", directory, query3);
}
private static void SearchAndDisplay(string title, Directory directory, Query query3) {
var searcher = new IndexSearcher(directory);
Hits hits = searcher.Search(query3);
Console.WriteLine(title);
for (int i = 0; i < hits.Length(); i++) {
Console.WriteLine(hits.Doc(i).GetField("name").StringValue());
}
}
Hi HakonB, dzięki za odpowiedź. Użyłem nieokreślonego dla kilku innych wyszukiwań, ale problem polega na tym, że jeden element może znajdować się zarówno w "Rzeczy", jak i "Inne rzeczy" i musi zostać znaleziony podczas wyszukiwania jednego lub obu. EG: A na rzeczy i inne rzeczy B w tylko rzeczy C w ciągu zaledwie inne rzeczy Szukaj rzeczy {A, B} Szukaj innych rzeczy {A, C} Search na rzeczy i inne rzeczy { A} – fyjham
Dodałem kolejną próbkę, która ilustruje, jak uzyskać poprawne wyniki - to znaczy, jeśli rozumiem cię teraz :-) – HakonB
Ah, dzięki! Wydaje mi się, że dokładnie to, czego szukałem. Nigdy nie przyszło mi do głowy, że mogę dodać 2 pola o tej samej nazwie do 1 dokumentu. Nadal myślę za bardzo jak typowa relacyjna baza danych, którą zgaduję =) – fyjham