Разница между LinqToLucene и Lucene.Net.Linq

  1. Отличаются ли проекты LinqToLucene и Lucene.Net.Linq?
  2. Каковы плюсы и минусы каждого из них?
  3. Поскольку я обнаружил, что 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"
    

    Если функции этого расширения недоступны, то в чем смысл этого проекта?

  4. Если это не главное, как я могу использовать предварительные запросы в 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 минусы:

  1. Недоступно на NuGet
  2. Не активно поддерживается
  3. Очень ограничен в том, что вы можете положить в where пункт
  4. В сочетании с EF, хотите вы этого или нет

Профи Lucene.Net.Linq:

  1. Активно поддерживается
  2. Пакеты (и символы!) Опубликованы в NuGet
  3. Лучшее понимание сложных запросов
  4. Свободные API и API-атрибуты для сопоставления свойств с полями и управления анализом, хранением и индексацией

Минусы Lucene.Net.Linq:

  1. Документация может быть лучше
  2. Только несколько вкладов за пределами моей
  3. Неясная производительность по сравнению с ванильным 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 > ()) {}

}

Вы можете работать с файловой системой, а не с системной памятью.

Другие вопросы по тегам