Amazon Neptune Полнотекстовый поиск - укажите поля - PullRequest
4 голосов
/ 15 января 2020

Итак Документация SPARQL содержит примеры того, как указать несколько полей для поиска:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query 'mikael~ OR rondelli' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:field foaf:surname .
    neptune-fts:config neptune-fts:return ?res .
  }
}

Я пытаюсь сделать то же самое, но в Gremlin:

g.withSideEffect('Neptune#fts.endpoint', '...')
  .V().has(['name', 'company'], 'Neptune#fts term*')

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

g.withSideEffect('Neptune#fts.endpoint', '...')
  .V().has('*', 'Neptune#fts term*')

Но теперь я сопоставляю все поля, и это не удается, потому что в нашем индексе слишком много. (Я думаю, что существует ограничение в 1024).

Есть идеи, как задать список полей для поиска в запросе Gremlin?

1 Ответ

4 голосов
/ 15 января 2020

Тем временем я нашел обходной путь, который работает, но не очень чистый:

Вы можете настроить свой запрос на использование формата query_string, например:

.withSideEffect("Neptune#fts.queryType", "query_string")

Синтаксис будет менее прощающим, но это означает, что вы можете искать поля внутри запроса:

field1:foo AND field2:bar

Теперь с Нептуном это не так просто потому что ваши имена полей не просто field1, field2, но они отформатированы следующим образом:

predicates: {
  field1: {
    value: "..."
  },
  field2: {
    value: "..."
  }
}

Хорошо, вам просто нужно изменить запрос:

predicates.field1.value:foo AND predicates.field2.value:bar

И вот как я делаю "убедитесь, что некоторые поля соответствуют термину" :

predicates.field1.value:<term> OR predicates.field2.value:<term>

...