2013-08-07 4 views
1

Я очень новичок в поиске/индексировании, и я работаю над использованием FosElasticaBundle от Symfony для обеспечения функциональности поиска в веб-приложении. У меня есть настройка и запуск без проблем, пока я не обнаружил, что параметр по умолчанию разрешает полный поиск по словам.Конфигурация FOSElasticaBundle/elasticsearch для частичного совпадения слов

Затем я попытался в течение нескольких часов, чтобы обеспечить частичное совпадение слов без везения. Я пробовал nGram и edgenGram и т. Д., Но я был очень смущен всеми понятиями. Я попытался найти учебник по концепциям и конфигурациям, но не получал ответов.

Вот мой конфиг:

fos_elastica: 
    clients: 
     default: { host: localhost, port: 9200 } 
    serializer: 
     callback_class: FOS\ElasticaBundle\Serializer\Callback 
     serializer: serializer 
    indexes: 
     website: 
      client: default 
      finder: ~ 
      settings: 
       index: 
        analysis: 
         analyzer: 
          index_analyzer: 
           tokenizer: "nGram" 
           filter: ["lowercase", "snowball"] 
          search_analyzer: 
           tokenizer: "nGram" 
           filter: ["lowercase", "snowball"] 

         filter: 
          snowball: 
           type: "snowball" 
           language: "English" 
      types: 
       client: 

        mappings: 
         BusinessName: { boost: 10 } 
         users: 
          type: "object" 
          properties: 
           firstName: { boost: 5 } 
           lastName: { boost: 5 } 
           email: { boost: 10 } 
        persistence: 
         driver: orm # orm, mongodb, propel are available 
         model: E1\Bundle\CoreBundle\Entity\Client 
         listener: 
         provider: ~ 
         finder: ~ 

документация не полезно. Может ли кто-нибудь дать мне некоторый свет о том, как получить частичное сопоставление слов и/или сообщить мне, где я могу найти учебное пособие по концепциям (токенизатор, фильтры, анализатор)?

ответ

4

Если вы используете поиск по умолчанию: $resultSet = $userType->search('bob');, у вас будет очень ограниченный набор возможностей ElasticSearch.

Код по умолчанию выполнить Query::create($query);, которые создают запрос QueryString.

QueryString велики, потому что вы можете написать подстановочные и поиск на _all поле по умолчанию, так что если вы хотите Po соответствовать документы, содержащие Пони, вы должны использовать $userType->search('Po*');.

Здесь не нужен пользовательский анализатор. Стандартные уже используют пробелы для разделения слов и ввода всего нижнего регистра.

О документации и помощи, имейте в виду, что Elastica - это инструмент, настоящая поисковая система - это ElasticSearch, поэтому лучший совет, который я могу вам дать, - написать и прототипировать ваши запросы в Json. Вы можете использовать плагин Head, или этот Chrome Extension.

+0

Но с использованием ('Po *') будут получены все документы, где «Po» или «po» независимо от того, где они были размещены - в начале или в середине или в конце. Есть ли способ ограничить поиск, так что найдены только элементы, начинающиеся с «po»? –

Смежные вопросы