полнотекстовый поиск с использованием Google App Engine и JDO?

StackOverflow https://stackoverflow.com/questions/1496023

Вопрос

Я использую Google App Engine (Java) с JDO.Как я могу сделать JDO-эквивалент

select * from table where field like '%foo%'

Единственная рекомендация, которую я пока видел, — использовать Lucene.Я немного удивлен, что что-то настолько простое невозможно в готовом GAE.

Это было полезно?

Решение

Вы не можете выполнять подобный поиск по подстрокам в App Engine.Причина этого в том, что хранилище данных App Engine создано с возможностью масштабирования и отказывается выполнять любой запрос, который он не может удовлетворить с помощью индекса.Индексировать такой запрос практически невозможно, поскольку для этого требуется выполнить поиск соответствия по всему свойству «поле» каждой записи.Любая реляционная база данных, к которой вы запускаете этот запрос, выполнит его, выполнив полное сканирование таблицы и проверив каждую запись индивидуально - немасштабируемо, если не сказать больше.

Решение, как вы уже выяснили, — использовать полнотекстовую индексацию, например Lucene.Существуют библиотеки для запуска Lucene в App Engine, например GAELucene.Это также дает вам возможность правильного полнотекстового поиска, а не простого сопоставления подстрок.

Другие советы

вр; доктор:Управляйте собственным свойством многозначного поиска и выполняйте к нему запросы равенства.

Подробности:Для тех, кто ищет что-то простое и сделанное своими руками, вы можете сделать следующее:

  1. В вашей сущности создайте многозначный searchTerms свойство.Он будет содержать элементы объекта, доступные для поиска.

  2. Разделите текст вашей сущности, доступный для поиска, на слова.Эти слова будут единственными частями объекта, доступными для поиска.Вы можете начать с разделения на пробелы или добавить базовую основу.Например.при работе с адресами электронной почты вам может потребоваться разместить части пользователя и домена отдельно, чтобы можно было выполнять поиск по обеим.Если ваша сущность обновилась, вам потребуется перестроить это свойство.

  3. Чтобы выполнить поиск, разделите входные данные поиска на слова (при необходимости выполнив базовую обработку) и добавьте каждое из них в качестве фильтра, используя оператор равенства для searchTerms свойство.

    ( = оператор многозначного свойства спрашивает, есть ли любой значение равно фильтру.)

    Например.(с использованием Объективизировать):

    Query query = dao.ofy().query(Recipe.class);
    for (String term : search.toLowerCase().split(" ")) {
      query = query.filter("searchTerms =", term);
    }
    

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top