Алголия - Поиск с условием для просмотра массива строк

Я использую рельсы и драгоценный камень algolia с хранилищем данных mongoid.

Я отправляю данные в алголию для модели Question. Один из примеров документов в системе Algolia:

objectID: 5691e056410213a381000000
text: "what is #cool about your name Mr. John? #name #cool"
asked_to: ["565571704102139759000000", "i7683yiq7r8998778346q686", "kjgusa67g87y8e7qtwe87qwe898989"]
asked_by: "564a9b804102132465000000"
created_at: "2016-01-10T04:38:46.201Z"
card_url: "http://localhost:3000/cards/5691e056410213a381000000"
answerers: []
has_answer: false
requestor_count: 0
status: "active"
popularity_point: 0
created_at_i: 1452400726
_tags: ["cool", "name"]

Я хочу найти все те документы, где он соответствует этим двум условиям: 1) text содержит your name 2) asked_to содержит i7683yiq7r8998778346q686

Я использую библиотеку JavaScript typeahead Twitter. И мой пользовательский интерфейс javascript для реализации поиска algolia выглядит следующим образом:

<input class="typeahead ui-widget form-control input-md search-box tt-input" id="typeahead-algolia" placeholder="Search questions" spellcheck="false" type="text" autocomplete="off" dir="auto" style="position: relative; vertical-align: top;">

$(document).on('ready page:load', function () {

  var client = algoliasearch("APPLICATION_ID", "SEARCH_KEY");
  var index = client.initIndex('Question');

  $('#typeahead-algolia').typeahead(
    {
      hint: false,
      highlight: true,
      minLength: 1
    }, 
    {
      source: index.ttAdapter({hitsPerPage: 10}),
      displayKey: 'text'
    }
  ).on('keyup', this, function (event) {
    if (event.keyCode == 13) {
      $('#typeahead-algolia').typeahead('close');
      window.location.href = "/?keyword="+encodeURIComponent($('#typeahead-algolia').val());
    }
  });

  $('.typeahead').bind('typeahead:select', function(ev, suggestion) {
    window.location.href = suggestion.card_url;
  });

});

Итак, мой вопрос:

Этот код работает отлично. Но как добавить условие для asked_to contains i7683yiq7r8998778346q686 в приведенном выше javascript, чтобы отфильтровать результат.


person JVK    schedule 11.01.2016    source источник


Ответы (1)


Вы можете использовать фасетный фильтр для атрибута asked_to в запросе.

Сначала вам нужно объявить атрибут asked_to в качестве атрибута для фасетирования в настройках вашего индекса, а затем передать asked_to:i7683yiq7r8998778346q686 в качестве фильтра фасетов в вашем запросе через параметр facetFiltersquery.

Когда ваши настройки индекса изменены, вы можете изменить свой источник, чтобы добавить параметр facetFilters:

$('#typeahead-algolia').typeahead(
    {
        hint: false,
        highlight: true,
        minLength: 1
    }, 
    {
        source: index.ttAdapter({hitsPerPage: 10, facetFilters: "asked_to:i7683yiq7r8998778346q686"}),
        displayKey: 'text'
    }
).on('keyup', this, function (event) {
    if (event.keyCode == 13) {
        $('#typeahead-algolia').typeahead('close');
        window.location.href = "/?keyword="+encodeURIComponent($('#typeahead-algolia').val());
    }
});
person speedblue    schedule 11.01.2016