Поиск данных в DynamoDB или использование службы поиска

Я нахожу, что это работает:

function abbreviate_string_to_whole_word ($ string, $ max_length, $ buffer) {

if (strlen($string)>$max_length) {
    $string_cropped=substr($string,0,$max_length-$buffer);
    $last_space=strrpos($string_cropped, " ");
    if ($last_space>0) {
        $string_cropped=substr($string_cropped,0,$last_space);
    }
    $abbreviated_string=$string_cropped." ...";
}
else {
    $abbreviated_string=$string;
}

return $abbreviated_string;

}

Буфер позволяет вам чтобы отрегулировать длину возвращаемой строки.

0
задан Mark 2 March 2019 в 02:36
поделиться

2 ответа

Dynamodb лучше всего подходит для значения ключа Insert and Retrieval.

Он не поддерживает функцию поиска, если вы пытаетесь выполнить сканирование с некоторым условием, которое будет O (n), и это будет очень дорого, так как вы потребляете много емкости для чтения.

Теперь перейдем к опциям

  1. Если вариант использования - это не полнотекстовый поиск, а только совпадение значения ключа, вы можете попытаться придумать композитный ключ , но он будет иметь недостатки, такие как

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

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

  2. Идеальным решением является использование упругого поиска или индексации Solr. У вас может быть лямбда-функция, слушающая поток DynamodB, выполняющая преобразование и помещающая данные вasticsearch Но это будет иметь ограничения, такие как

    а. Кластер эластичного поиска является дорогостоящим .

0
ответ дан best wishes 2 March 2019 в 02:36
поделиться

При запросе к DynamoDB, если вы не задаете ограничения для ключа раздела и ключа сортировки, вы в значительной степени сканируете либо весь раздел, либо всю таблицу. И это дорого. Вы все еще можете выполнить сканирование префикса на 1 поле, используя это поле в качестве ключа сортировки. Вы не можете оптимизировать запрос и ваши расходы в дальнейшем.

Для выполнения полнотекстового поиска вам действительно необходимо токенизировать текстовое поле и построить инвертированный индекс, используя эти токены. Это то, что делает Elasticsearch.

Служба под названием Rockset может привязывать ваши таблицы DynamoDB и предоставлять на них полнофункциональный SQL. Вы можете использовать SQL LIKE или REGEXP_LIKE для выполнения элементарного текстового поиска. Но, если вы не выполняете сканирование префиксов, весь инвертированный индекс для поля все равно будет сканироваться. Rockset поддерживает токенизацию текстового поля для эффективного выполнения полнотекстового поиска.

В этом блоге рассказывается о том, как вы можете использовать Rockset для запроса данных в таблицах DynamoDB с использованием SQL: https://rockset.com/blog/running-fast-sql-on-dynamodb-tables/

Кроме того, список функций текстового поиска, поддерживаемых Rockset: https://docs.rockset.com/text-search-functions/

Полное раскрытие: я работаю в инженерной команде @ Rockset.

0
ответ дан sandy 2 March 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: