Разница между LinqToLucene и Lucene.Net.Linq
- Отличаются ли проекты LinqToLucene и Lucene.Net.Linq?
- Каковы плюсы и минусы каждого из них?
Поскольку я обнаружил, что Lucene.Net.Linq обновляется относительно недавно относительно LinqToLucene, и он доступен в nuget, я хочу использовать его в своем простом проекте, но я столкнулся с отсутствием документации и не могу найти, как я могу использовать lucene расширенные запросы с этим пакетом, такие как возможные в LinqToLucene, например:
var query = from c in index.Customers where c.Like("amber") || c.CompanyName.Between("a", "d") where !c.CustomerId == "Jason"
Если функции этого расширения недоступны, то в чем смысл этого проекта?
- Если это не главное, как я могу использовать предварительные запросы в LINQ to Lucene.Net?
2 ответа
LINQ to Lucene, кажется, неактивен. Последний коммит на момент написания статьи был в октябре 2012 года, а последнее дискуссионное сообщение с вопросом о том, активен ли проект, осталось без ответа с того же периода времени.
LINQ to Lucene тесно связан с Entity Framework, поэтому мне кажется, что проект предназначен для индексации данных, поступающих из EF, для свободного текстового поиска.
Lucene.Net.Linq - это совершенно отдельный проект, который я начал в 2012 году и активно поддерживаю. Этот проект не связан с EF или другими библиотеками. Это зависит только от Lucene.Net, Common.Logging для ведения журнала и Remotion.Linq для помощи в разборе и переводе запросов LINQ. Первоначально я оценил возможность внести свой вклад в LINQ для Lucene, но обнаружил, что тесная связь с EF и некоторые другие предположения сделали библиотеку неподходящей для моих нужд.
LINQ для Lucene минусы:
- Недоступно на NuGet
- Не активно поддерживается
- Очень ограничен в том, что вы можете положить в
where
пункт - В сочетании с EF, хотите вы этого или нет
Профи Lucene.Net.Linq:
- Активно поддерживается
- Пакеты (и символы!) Опубликованы в NuGet
- Лучшее понимание сложных запросов
- Свободные API и API-атрибуты для сопоставления свойств с полями и управления анализом, хранением и индексацией
Минусы Lucene.Net.Linq:
- Документация может быть лучше
- Только несколько вкладов за пределами моей
- Неясная производительность по сравнению с ванильным Lucene.Net (тестирование производительности не было сделано)
Документация, такая, какая она есть, состоит из проекта README и примера кода в проекте модульного тестирования.
Lucene.Net.Linq не имеет методов расширения для каждого запроса, который Lucene.Net поддерживает изначально. Тем не менее, он обеспечивает аварийный люк, где вы можете пройти в своем собственном Query
:
var result = customers
.Where(new TermRangeQuery("CompanyName", "A", "C", includeLower: true, includeUpper: true))
.ToList();
И он поддерживает поиск любого индексированного поля с нечетким соответствием:
var result = customers
.Where(c => (c.AnyField() == "amber").Fuzzy(1.0f))
.ToList();
И он поддерживает простое сопоставление с ==
а также !=
:
var result = customers
.Where(c => c.CustomerId != "Jason")
.ToList();
Обратите внимание, что значение ==
управляется тем, как индексируется данное поле. Если поле проиндексировано как ключевое слово, вступает в силу точное соответствие. Если поле является токенизированным, основанным, преобразованным в строчные буквы и т. Д., То ==
будет соответствовать любому термину в этой области.
С этим кодом:
var directory = FSDirectory.Open(AppDomain.CurrentDomain.BaseDirectory + "/index/recipes");
using(var provider = new LuceneDataProvider(directory, Lucene.Net.Util.Version.LUCENE_30)) {
using(var session = provider.OpenSession < CatalogItemDocument > ()) {}
}
Вы можете работать с файловой системой, а не с системной памятью.