Рубрики
Без рубрики

Solr + Python – учебник

Как создать страницу галереи с Solr и Python. Tagged Solr, Python, Учебник.

Обновление : Я толкнул свой код Python в Github ( Reppo здесь ). Моя реализация тачка более продвинутая, чем этот учебник. Смотрите файл readme и комментарии кода.

Solr является популярным, пылающим, быстрым, открытым исходным конечным исходным оборудованием, построена на Apache Lucene (веб-сайт Solr).

Цель

Моя цель – продемонстрировать постройку страницы галереи электронной коммерции с поиском, страницей, фильтрацией и несколькими выборами, которые отражают ожидания типичного пользователя. Посмотреть Эта статья При хорошем объяснении фильтрации Multi-Select я пытаюсь реализовать.

Поиск должен работать на фразах, таких как «Mens ShrT Gap» или «Gap 2154ABC», факторинг в опечатках, различных формах слова ( stemming ) и фонетическое правописание.

Solr Setup.

Solr 7 устанавливается локально на моем компьютере с активным подключением к базе данных. Solr использует DeltaQuery Особенность (в …| db-data-config.xml ) Чтобы обнаружить изменения в моей базе данных и импортировать эти записи в Solr.

Настройка веб-разработки

У меня есть базовое приложение Django/React с Python 3. Посмотреть Эта статья Для идей о том, как интегрировать Джанго с реагированием. Я рекомендую использовать Эти инструкции Чтобы создать свой собственный клиент Solr.

Я рассматривал возможность использования Pysolr Как клиент, но ему не хватает хорошей документации и, похоже, пренебрегали с 2015 года (как большинство библиотек Solr). Тем не менее, Pysolr может работать, если вы готовы расчесывать через проблемы GitHub и CodeBase.

Если вы используете Pysolr:

  1. Паста Экспорт В ваш терминал перед запуском вашего сервера, и вы сможете просмотреть URL, сгенерированный Pysolr.

  2. URL, который вы видите в вашем терминале, не связан в вопросах кодирования URL-URL, поэтому запрос, как Dolce & Gabbana Будет работать на вашем сайте, но перерываться при вставке URL в браузер.

Лица и фасет

Аспекты являются синонимическими категориями или спецификациями продукта. У Solr есть возможность вернуть доступные аспекты со своими соответствующими подсчетами для конкретного запроса. Вы можете управлять минимальным количеством продуктов, требуемых в аспекте, установив facet.mincount = <номер> .

Например, если вы продаете бренд имени одежды, аспекты может относиться к полу, стилю и материалу. Если поиск был для «мужской повседневной пробелы», аспекты возвращаются бы так (обратите внимание на ограничения на пол и Стиль ):

"facet_fields" : {
   "gender" : [
       "Men" , 25,
       "Women" , 0 
    ],
   "style" : [
       "casual", 10,
       "dress", 0
    ],
   "material" : [
       "wool", 15,
       "cotton", 10
    ],
   }

Пример запроса

Давайте пройдемся через пример:

from urllib.request import urlopen
import urllib.parse
import simplejson

def gallery_items(current_query):

    solr_tuples = [
        # text in search box
        ('q', "mens shirt gap"),
        # how many products do I want to return
        ('rows', current_query['rows_per_page']),
        # offset for pagination
        ('start', current_query['start_row'] * current_query['rows_per_page']),
        # example of a default sort, 
        # for search phrase leave blank to allow 
        # for relevancy score sorting
        ('sort', 'price asc, popularity desc'),
        # which fields do I want returned
        ('fl', 'product_title, price, code, image_file'),
        # enable facets and facet.pivots
        ('facet', 'on'),
        # allow for unlimited amount of facets in results
        ('facet.limit', '-1'),
        # a facet has to have at least one 
        # product in it to be a valid facet
        ('facet.mincount', '1'),
        # regular facets
        ('facet.fields', ['gender', 'style', 'material']),
        # nested facets
        ('facet.pivot', 'brand,collection'),
        # edismax is Solr's multifield phrase parser
        ('defType', 'edismax'),
        # fields to be queried
        # copyall: all facets of a product with basic stemming
        # copyallphonetic: phonetic spelling of facets
        ('qf', 'copyall copyallphonetic'),
        # give me results that match most fields
        # in qf [copyall, copyallphonetic]
        ('tie', '1.0'),
        # format response as JSON
        ('wt', 'json')
    ]

    solr_url = 'http://localhost:/solr//select?'
    # enocde for URL format
    encoded_solr_tuples = urllib.parse.urlencode(solr_tuples)
    complete_url = solr_url + encoded_solr_tuples
    connection = urlopen(complete_url)
    raw_response = simplejson.load(connection)

Поиск фразы будет обсуждаться в следующем разделе – моделирование схемы.

  • Я бы предложил использовать кортежи для каждой пары ключа, так как будет легче Urlencode Отказ Также будет легче манипулировать, особенно когда у вас сложно FQ с тонкой И , Или Логика (которая произойдет очень скоро, если вы делаете фильтрацию).
  • Каждая группа фасет будет иметь свою FQ поле. Это гарантирует, что И Логика применяется по группам фильтров. Вот код для подачи заявления Или Логика в Группе лицензий:
    def apply_facet_filters(self):
        if self.there_are_facets():
            for facet, facet_arr in self.facet_filter.items():
                if len(facet_arr) > 0:
                    new_facet_arr = []
                    for a_facet in facet_arr:
                        new_facet_arr.append("{0}: \"{1}\"".format(facet, a_facet))
                    self.solr_args.append(('fq', ' OR '.join(new_facet_arr)))

  • facet.pivot.mincount Позволяет управлять минимальным количеством продуктов, необходимых для Facet.Pivot , но будьте осторожны, если вы установите его на 0, Ваш сервер, скорее всего, сбой .
  • Я нашел Это значения поля, необходимые для отформатирования в кавычках: 'fq': "Бренд: \" {0} \ "". Формат (refe_query ['current_brand']))
  • аспекты возвращаются в таких массивах, как [«Бренд», «Разрыв»] , а не Dict () которые я нахожу неудобно. Вот один из способов отформатировать их:
import more_itertools as mit
facets = {}

for k,v in raw_response['facet_counts']['facet_fields'].items():
    spec_list = [list(spec) for spec in mit.chunked(v, 2)]
    spec_dict = {}
    for spec in spec_list:
        spec_dict[spec[0]] = spec[1]
    facets[k] = spec_dict

raw_response['facet_counts']['facet_fields'] = facets
  • По умолчанию, если пользователь выбирает аспект в группе Facet, SOLR вернет эту группу FACET только с выбранным фастом, поскольку поиск был сужен. Но многие времена пользователь все еще хотел бы просмотреть необоснованные грани и связанные с ними счетчики, чтобы включить Multi-Select. Чтобы разрешить эту функциональность, использовать Тегирование и исключение Отказ Посмотреть мой репо для возможной реализации.
  • Создание ценовых диапазонов в виде фильтра с пользовательскими интервалами, копировать Цена на новое поле с одним из Три fieldtypes Отказ Новое поле должно быть Индексировано и хранится Установить на ложь и Docvalues Установить на правда Отказ Тогда следуйте за Инструкции добавить пользовательские диапазоны. Смотрите следующий раздел по моделированию схемы. Посмотреть мой репо для возможной реализации.

Моделирование схемы

Если вы сможете пройти прошедшую идею, что поля существуют просто для хранения свойств данных, и охватывают идею, которую вы можете манипулировать данными, поэтому его можно найти, так как пользователи ожидают его, то вы можете начать эффективно программировать правила актуальности в поисковую систему. (Соответствующий поиск, глава 5)

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

Посмотрите на Документация о том, как обновить схему, особенно разделы на токена и Фильтрация Отказ Узнайте о stemming filters Отказ Спросите себя, какие жетоны/фильтры актуальны для вашей ситуации, и следует ли применить его в запрос или время индекса.

Я буду следовать за Рекомендация в документации Чтобы скопировать все поля, пользователь может заинтересовать в одном Кополл поле. Это решает Эмин слона альбиноса , а также распределение сигнала:

Как мы уже говорили, когда пользователи обыскивают, они обычно все равно, как документы разлагаются в отдельные поля. Многие пользователи поиска ожидают работать с документами в качестве единого устройства: чем больше их поисковых терминов, которые соответствуют, тем более актуальным документом должен быть. Может удивить вас знать, что поисковые функции, которые реализовали эту идею, опаздывали на вечеринку. Вместо этого Multifield поиск Multifield на основе Lucene зависел от полей, ориентированных на техниках. Вместо того, чтобы термины поиска полей, ориентированный поиск полей оценивает Центр функции ранжирования. В этом разделе мы точно изучаем, почему подходы, ориентированные на полей, могут создавать проблемы релевантности. Вы увидите, что имеющие рейтинговые функции, ориентированные на поля, создают две проблемы:

Проблема слона альбиноса – Неспособность дать более высокий ранг до документов, которые соответствуют более качественным условиям поиска.

Сигнал расправки – релевантность оценки на основе неразрушающегося оценки составляющих деталей (название против тела) вместо того, чтобы оценить весь документ или более интуитивные большие части, такие как текст всей статьи или люди, связанные с этим фильмом. (Соответствующий поиск, глава 6)

Мы будем использовать Схема API через Admin ui Отказ Вы не можете редактировать файл схемы вручную ( Почему ). Вот рецепт для создания Кополл поле:

  • Шаг 1: Создайте fieldtype для поля. Я использую то же самое fieldtype как для индекса, так и для времени запроса. Я сохранил stemming Light, чтобы гарантировать, что имена брендов остаются не поврежденными.
      
        
          
          
          
          
          
        
      
  • Шаг 2: Создайте Кополл поле со аспектами как fieldtype. . Установить многозначные = правда Чтобы разрешить несколько значений в поле (как массив). Установить omitnorms = правда Поскольку пользователи не заботятся о длине каждого поля ( Docs ), и мы не хотим, чтобы Solr заботиться либо.

  • Шаг 3: Создайте копирование для каждого поля в источнике данных, которые вы хотите скопировать. Помните, Там нет цепочки копий поля Отказ

    {
       "add-copy-field":{
           "source":"brand",
           "dest":"copyall"
        }
    }
  • Шаг 4: Повторите шаги 1-3, если вы хотите создать Кополл для фонетического написания. Используйте подходящий полевой тип. Я использую Beider-Morse Filter Отказ

  • Шаг 5: Добавьте выключатель галстука из 1, чтобы получить функциональность наиболее полей. Документы обеспечить хорошее объяснение.

Некоторые идеи:

  • Добавить Время индекса повышает Для продуктов, которые более популярны, и вы хотите, чтобы они ранжируются выше в результатах поиска. Вы также можете сделать увеличение времени запроса, что-то в силу bf = 'div (1, популярность)' .

  • Использовать Функциональные запросы Чтобы настроить что-либо о вашей оценке вашей релевантности результатов поиска.

  • Рассмотрим N-грамм Фильтр для опечатки.

  • Рассмотрим Edge-N-грамм Фильтр для автозаполнения.

  • Рассмотреть возможность использования text_en fieldtype Для регулярных английских слов (это один из многих FieldTypes которые приходят с Solr ):

  
    
      
      
      
      
      
      
    
    
      
      
      
      
      
      
      
    
  

Отладка и рабочий процесс

  • Проверьте анализ в Admin UI для того, как конкретные условия анализируются при индексе или времени запроса.
  • Добавить console.log В вашем коде для печати URL для каждого запроса. Установить Debugquery = True и прочитайте Parsedqeury и Объясните Отказ Все математическое веселье скрывается в Объясните (См. Соответствующий поиск, глава 2).
  • После переопределения схемы Обязательно удалите Все документы в вашем индексе и сделайте свежий полнопотреблять из вашей базы данных. Это можно сделать в UI Admin.
  • Если вам нужно отладить импорт базы данных, используйте режим отладки с помощью Verbose Output.

Дальнейшее чтение

Соответствующий поиск | Дуг Глэкбулл и Джон Берриман

Примеры в книге используют Elasticsearch, но приложение B предоставляет отображения для Solr. Если книга слишком длинная, читай главы 5 и 6. Эти главы сняты, какая стратегия использовать для сопоставления мультипользования (фразы) поиска с наиболее актуальными результатами.

Оригинал: “https://dev.to/avikaminetzky/solr–pythona-tutorial-3cni”