Как вести текстовый поиск в FaunaDB - PullRequest
1 голос
/ 09 июля 2020

Как искать документы по атрибуту?

Например: у нас есть набор городов, и мы хотим искать по атрибуту их имени

1 Ответ

2 голосов
/ 09 июля 2020

Я чувствовал, что этот топи c недостаточно хорошо освещен, поэтому я опубликую рабочий пример.

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

CreateIndex({
name: 'cities_by_ngrams',
source: [
    {
      // If your collections have the same property that you want to access you can pass a list to the collection
      collection: [Collection('cities')],
      fields: {
        wordparts: Query(
          Lambda('city',
            Distinct(
              Union(
                Let(
                  {
                    ngrams: q.Map(
                      // ngrams
                      [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
                      Lambda('i', NGram(
                        LowerCase(Select(['data', 'name'], Var('city'))),
                        Var('i'),
                        Var('i'),
                        )
                      )
                    )
                  },
                  Var('ngrams')
                )
              )
            )
          )
        )
      }
    }
  ],
terms: [
    {
      binding: 'wordparts'
    }
  ]
})

, а затем поиск с разбивкой на страницы

Map(
  Paginate(Match(Index('cities_by_ngrams'), 'londo')),
  Lambda('ref', Get(Var('ref')))
)

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

...