Google App Engine - поиск по ключевым словам + упорядочение по другим свойствам - PullRequest
2 голосов
/ 10 января 2012

Скажем, у меня есть объект, который выглядит примерно так:

class MyEntity(db.Model):
    keywords            = db.StringListProperty()
    sortProp            = db.FloatProperty()

У меня есть фильтр, который выполняет поиск по ключевым словам, выполнив это:

query = MyEntity.all()\
                .filter('keywords >=', unicode(kWord))\
                .filter('keywords <',  unicode(kWord) + u"\ufffd")\
                .order('keywords')

Который прекрасно работает. Проблема, с которой я сталкиваюсь, заключается в том, что, если я попытаюсь выставить заказ с помощью sortProp:

                .order('sortProp')

порядок не имеет эффекта. Я понимаю, почему - в документации конкретно сказано, что это невозможно, и этот порядок сортировки игнорируется при использовании фильтров равенства с многозначным свойством (из документов Google):

Одним важным предупреждением являются запросы как с фильтром равенства, так и с порядок сортировки по многозначному свойству. В этих запросах сортировка порядок не учитывается. Для однозначных свойств это простой оптимизация. Каждый результат будет иметь одинаковое значение для свойства, поэтому результаты не нужно сортировать дальше. Тем не менее, многозначный свойства могут иметь дополнительные значения. Так как порядок сортировки без учета результатов запроса могут быть возвращены в другом порядке чем если бы порядок сортировки был применен. (Восстановление сброшенного порядка сортировки будет дорого и потребует дополнительных индексов, и этот вариант использования редко, поэтому планировщик запросов оставляет это.)

Мой вопрос: кто-нибудь знает хороший обходной путь для этого? Есть ли лучший способ поиска по ключевым словам, который обходит это ограничение? Я действительно хотел бы объединить использование ключевых слов с упорядочением для других свойств. Единственное решение, которое я могу придумать, - это сортировка списка после запроса, но если я это сделаю, я потеряю способность смещаться в запрос и даже не получу результаты с самым высоким порядком сортировки, если набор данных большой.

Спасибо за ваши советы!

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Обходной путь 1: Примените алгоритмы для ключевых слов, тогда вам не нужно сравнивать.

Обходной путь 2: Храните все уникальные ключевые слова в отдельной группе сущностей («таблица»). В этой группе найдите ключевые слова, которые соответствуют вашим критериям. Затем выполните запрос с keywords IN [kw1, kw2, ...]. Убедитесь, что количество подходящих ключевых слов не слишком велико, например, вы можете выбрать только первые 10.

Обходной путь 3: Изменить порядок элементов на стороне приложения

Обходной путь 4: Используйте IndexTank для полнотекстового поиска или подайте заявку на участие в программе Trusted Tester, как упомянуто @ proppy.

1 голос
/ 11 января 2012

Вместо того, чтобы сопоставлять префиксы, правильно токенизируйте, обрезайте и нормализуйте ваши строки и сравнивайте их на равенство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...