Сложный запрос в Solr, это возможно? - PullRequest
2 голосов
/ 31 марта 2011

Эй, ребята, я новичок в Solr и хочу выполнить следующий сценарий (ниже), но не уверен, что Solr способен обрабатывать подобные случаи:

Проблема очень прямая, я хочу построить поиск по сравнению цен. Вот мои рациональные таблицы БД:

t_company:
company_id
company_name

t_product:
product_id
product_price

t_company_product:
company_product_id
company_id
product_id

В Solr я хочу выполнить следующий поиск - получить все компании, которые предлагают 1 или несколько конкретных продуктов по самой низкой ВСЕГО цене (поэтому, если вы выбираете винты, гвозди и листовой камень, я хочу сделать общую покупку самая низкая цена).

Когда я настраивал свою схему, я определял бизнес как основной объект, а product_ids и product_prices - как два многозначных поля.

Могу ли я сделать такой запрос? Как бы я сделал сумму?

Вот все мои XML schema.xml и data-config.xml

<document name="companies">
<entity name="company" dataSource="dsCompany" 
        query="select 
                      newid() as row_id,
                      company_id, 
                      company_name
               from 
                    t_company WITH (NOLOCK)">
    <field column="row_id" name="row_id" />
    <field column="company_id" name="company_id" />
    <field column="company_name" name="company_name" />
    <entity name="products" query="select 
                                        company_product_id, 
                                        product_id,
                                        price
                                   from 
                                        t_company_product WITH (NOLOCK)
                                   where 
                                        company_id='${company.company_id}'"
                                        dataSource="dsCompany">
        <field name="company_product_id" column="company_product_id" />
        <field name="product_id" column="product_id" />
        <field name="price" column="price" />                       
    </entity>
</entity>

<fields>
    <field name="row_id" type="string" indexed="true" stored="true" required="true"/>
    <field name="company_id" type="integer" indexed="true" stored="true" required="true" />
    <field name="company_name" type="text" indexed="true" stored="true"/>
    <field name="service_id" type="integer" indexed="true" stored="true" required="true" />
    <field name="price" type="tfloat" indexed="true" stored="true" required="true" />
 </fields>

Любая обратная связь будет принята с благодарностью !!!

Ответы [ 4 ]

1 голос
/ 05 апреля 2011

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

Обновление:
Чтобы использовать сумму, вы можете попытаться добавить динамическое поле для каждой цены продукта (я не знаю, как использовать сумму с многозначными полями или, если это возможно).

Добавить в data-config
<field name="price_${products.product_id}" column="price" />

Добавить в schema.xml
<dynamicField name="price_*" type="decimal" indexed="false" stored="true" />

и если я правильно понимаю, вы сможете использовать запрос вроде:
q = : & sort = sum (цена_ "идентификатор для гвоздей", цена_ "идентификатор для винтов", цена_ "идентификатор для ...") asc

0 голосов
/ 09 апреля 2011

Я думаю, вы можете спросить о том, как настроить скоринг.Вот пример в lucene.
http://sujitpal.blogspot.com/2010/10/custom-scoring-with-lucene-payloads.html

От LucidImagination http://www.lucidimagination.com/blog/2009/08/05/getting-started-with-payloads/

0 голосов
/ 05 апреля 2011

Solr не предназначен для замены реляционной базы данных.Если вы все еще хотите индексировать реляционный контент, его необходимо денормализовать, следовательно, он будет содержать избыточные данные.Таким образом, для большинства запросов счетчик результатов будет отключен, например, поиск только по названию компании даст большее количество результатов, чем ожидалось.Однако с обрушением поля вы можете уйти от этого.Однако если вы используете огранку, то удаление дубликатов оттуда невозможно.

Если вы формируете единую схему со всеми данными, которые вы упомянули, то вы можете выполнять реляционные запросы в определенной степени.Google "Solr Issue 2272", чтобы получить подробную информацию.В настоящее время это возможно только в пределах одной схемы.

Выполнение операции суммирования в поисковой системе в настоящее время невозможно, я считаю.я могу ошибаться, и если кто-то знает, как это сделать, мне тоже будет очень интересно.

0 голосов
/ 31 марта 2011

В 1.4.1, вероятно, в текущей магистрали (4.0) нет или, по крайней мере, не так просто.

В solr 1.4 есть свертывание полей, которое может выполнять агрегирование по возвращенным записям. В trunk solr 4.0 это превратилось в параметр группировки, который может выполнять только запросы типа min / max (насколько я знаю).

Документацию можно найти здесь:

http://wiki.apache.org/solr/FieldCollapsing

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

...