Thinking Sphinx - поиск по шаблонам только по определенным индексам

Я запускаю think-sphinx 2.0.10 в своей среде Rails 3.1, и индексация и поиск работают очень хорошо. Когда я ищу в своей модели User, я хочу выполнить поиск с подстановочными знаками по имени пользователя, но не по электронной почте, поэтому пользователь должен возвращаться только в том случае, если данная строка поиска точно соответствует электронной почте пользователя. Я провел небольшое исследование и обнаружил, что это можно сделать, включив поиск по шаблонам в блоке define_index с помощью

set_property :enable_star => true
set_property :min_infix_len => 1

и добавление :infixes => true в индексы, которые должны поддерживать поиск по шаблонам

define_index do

  indexes "CONCAT(first_name, ' ', last_name)", :as => :user_name,  :infixes => true
  indexes email

    has :id, :as => :user_id
    
    set_property :enable_star => true
    set_property :min_infix_len => 1
end

Это из автоматически созданного файла development.sphinx.conf.

index user_core
{
  source = user_core_0
  path = /../../../../db/sphinx/development/user_core
  charset_type = utf-8
  min_infix_len = 1
  infix_fields = user_name
  enable_star = 1
}

Думаю, infix_fields объявлены правильно.

Проблема в том, что если я ищу ".com", я все равно получаю всех пользователей с адресом электронной почты .com. В чем может быть причина этого?

Спасибо за вашу помощь!


person alex    schedule 06.12.2011    source источник


Ответы (1)


Sphinx индексирует слова во входных данных. Обычно только целые слова, но можно включить частичные слова с инфиксом / префиксом.

В любом случае, все, что не определено в charset_table (у вас его нет, поэтому по умолчанию), является разделителем.

Так "." является разделителем. Таким образом, ваш адрес электронной почты будет проиндексирован как слова. «com» ​​- это слово само по себе.

Таким образом, поиск «.com» - это просто поиск «com», т. Е. Поиск по целому слову.

Вы можете просто добавить "." в вашу таблицу кодировки, чтобы решить эту проблему. (но будьте осторожны, если он используется в качестве разделителя в ваших данных. Если просто индексировать имя и адрес электронной почты, это может не быть проблемой). Можно также добавить @, чтобы все письмо можно было проиндексировать как одно «слово».


Я не знаю, как написать вашу рубиновую конфигурацию, я просто знаю, что она должна попасть в конфигурационный файл sphinx.

person barryhunter    schedule 06.12.2011
comment
БОЛЬШОЕ СПАСИБО! я смог определить кодировку по умолчанию, которая включает @ и. в config / sphinx.yml и теперь все работает :) - person alex; 06.12.2011