Многое из него зависит от вида работы, которую я делаю. Я использую мерзавец или svn на в значительной степени всем, что я пишу в эти дни. Github поднимал планку для простоты сотрудничества и обычно что я ожидаю от репозитория SCM. TextMate всегда пригождается для отрывков, regex находят и заменяют, и все виды небольших тонкостей редактирования; для большинства проектов это - мой основной текстовый редактор. Для Java я потрачу хороший бит времени в Eclipse, и назад когда я был, сделал работу.NET, которую я буду использовать Visual Studio. Если я поцарапаю вместе дизайн прототипа для веб-сайта, я буду использовать Коду или что-то подобное.
при подсчете библиотек и платформ как "средства разработки", regexes Ruby берет пирог для простоты использования. Haskell Парсек победы для того, чтобы сделать серьезный парсинг, сопровождаемый очень тесно Java ANTLR. Шумиха быть проклятым, я должен все же быть как продуктивная запись веб-приложения, чем я с Ruby on Rails , хотя Опоры на земле Python хороши. Аналогично с Visual Studio для того, чтобы сделать клиентскую работу GUI, хотя я думаю Какао + , XCode в Leopard мог быть очень конкурентоспособным, если я когда-нибудь получаю хорошее схватывание на Objective C. IR LLVM является новым блоком, если Вы пишете компилятор.
У меня были проблемы с хранением реляционных данных i Lucene, но тот, который у вас есть, должно быть легко исправить.
Полагаю, вы токенизируете поля группы, и это дает возможность искать подстроки в значении поля. Просто добавьте нетокенизированное поле, и оно должно работать как положено.
Пожалуйста, проверьте следующий небольшой фрагмент кода:
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);
}
}
Образец добавляет в индекс два документа, которые не были идентифицированы, выполняет поиск материала и получает одно обращение. Если вы изменили код, чтобы добавить их в токенизированные, то у вас будет два совпадения, как вы видите сейчас.
Проблема с использованием Lucene для реляционных данных состоит в том, что можно ожидать, что поиск по шаблонам и диапазонам всегда будет работать. На самом деле это не так, если индекс большой из-за того, как Lucene решает эти запросы.
Другой пример, иллюстрирующий поведение:
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());
}
}