запрос solr в широколистном

Я новичок в Solr и Broadleaf.

Я работаю в Broadleaf, так как они используют поиск solr. это прекрасно и рабочее состояние. В таблице продуктов есть поле категории и поиск по категориям прямо сейчас. В соответствии с требованием я расширяю таблицу продуктов и создаю новую таблицу с идентификатором компании, поэтому в моей таблице расширенных продуктов есть два поля companyId и productId (fk с таблицей продуктов). Теперь я хочу также получить список продуктов по companyId.

наш файл schema.xml выглядит ниже

    <?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
    <fields>
        <field name="namespace" type="string" indexed="true" stored="false" />
        <field name="id" type="string" indexed="true" stored="true" />
        <field name="productId" type="long" indexed="true" stored="true" />
        <field name="category" type="long" indexed="true" stored="false" multiValued="true" />
        <field name="explicitCategory" type="long" indexed="true" stored="false" multiValued="true" />
        <field name="searchable" type="text_general" indexed="true" stored="false" />
        <dynamicField name="*_searchable" type="text_general" indexed="true" stored="false" />

        <dynamicField name="*_i" type="int" indexed="true" stored="false" />
        <dynamicField name="*_is" type="int" indexed="true" stored="false" multiValued="true" />
        <dynamicField name="*_s" type="string" indexed="true" stored="false" />
        <dynamicField name="*_ss" type="string" indexed="true" stored="false" multiValued="true" />
        <dynamicField name="*_l" type="long" indexed="true" stored="false" />
        <dynamicField name="*_ls" type="long" indexed="true" stored="false" multiValued="true" />
        <dynamicField name="*_t" type="text_general" indexed="true" stored="false" />
        <dynamicField name="*_txt" type="text_general" indexed="true" stored="false" multiValued="true" />
        <dynamicField name="*_b" type="boolean" indexed="true" stored="false" />
        <dynamicField name="*_bs" type="boolean" indexed="true" stored="false" multiValued="true" />
        <dynamicField name="*_d" type="double" indexed="true" stored="false" />
        <dynamicField name="*_ds" type="double" indexed="true" stored="false" multiValued="true" />
        <dynamicField name="*_p" type="double" indexed="true" stored="false" />

        <dynamicField name="*_dt" type="date" indexed="true" stored="false" />
        <dynamicField name="*_dts" type="date" indexed="true" stored="false" multiValued="true" />

        <!-- some trie-coded dynamic fields for faster range queries -->
        <dynamicField name="*_ti" type="tint" indexed="true" stored="false" />
        <dynamicField name="*_tl" type="tlong" indexed="true" stored="false" />
        <dynamicField name="*_td" type="tdouble" indexed="true" stored="false" />
        <dynamicField name="*_tdt" type="tdate" indexed="true" stored="false" />
    </fields>

    <uniqueKey>id</uniqueKey>

    <types>
        <!-- The StrField type is not analyzed, but indexed/stored verbatim. -->
        <fieldType name="string" class="solr.StrField" sortMissingLast="true" />

        <!-- boolean type: "true" or "false" -->
        <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" />

        <!-- Default numeric field types. For faster range queries, consider the 
            tint/tlong/tdouble types. -->
        <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0" />
        <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0" />
        <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0" />

        <!-- Numeric field types that index each value at various levels of precision 
            to accelerate range queries when the number of values between the range endpoints 
            is large. See the javadoc for NumericRangeQuery for internal implementation 
            details. Smaller precisionStep values (specified in bits) will lead to more 
            tokens indexed per value, slightly larger index size, and faster range queries. 
            A precisionStep of 0 disables indexing at different precision levels. -->
        <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0" />
        <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0" />
        <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0" />

        <!-- The format for this date field is of the form 1995-12-31T23:59:59Z, 
            and is a more restricted form of the canonical representation of dateTime 
            http://www.w3.org/TR/xmlschema-2/#dateTime The trailing "Z" designates UTC 
            time and is mandatory. Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z 
            All other components are mandatory. Expressions can also be used to denote 
            calculations that should be performed relative to "NOW" to determine the 
            value, ie... NOW/HOUR ... Round to the start of the current hour NOW-1DAY 
            ... Exactly 1 day prior to now NOW/DAY+6MONTHS+3DAYS ... 6 months and 3 days 
            in the future from the start of the current day Consult the DateField javadocs 
            for more information. Note: For faster range queries, consider the tdate 
            type -->
        <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0" />

        <!-- A Trie based date field for faster date range queries and date faceting. -->
        <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0" />

        <!-- A general text field that has reasonable, generic cross-language defaults: 
            it tokenizes with StandardTokenizer and down cases. -->
        <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
            <analyzer type="index">
                <tokenizer class="solr.StandardTokenizerFactory" />
                <filter class="solr.LowerCaseFilterFactory" />
            </analyzer>
            <analyzer type="query">
                <tokenizer class="solr.StandardTokenizerFactory" />
                <filter class="solr.LowerCaseFilterFactory" />
            </analyzer>
        </fieldType>

    </types>
</schema>

и файлы solrConfig.xml выглядят так

<?xml version="1.0" encoding="UTF-8" ?>
<config>
    <abortOnConfigurationError>${solr.abortOnConfigurationError:true} </abortOnConfigurationError>
    <luceneMatchVersion>LUCENE_40</luceneMatchVersion>
    <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}" />
    <updateHandler class="solr.DirectUpdateHandler2" />

    <query>
        <maxBooleanClauses>1024</maxBooleanClauses>

        <filterCache class="solr.FastLRUCache" size="512" initialSize="512" autowarmCount="0" />
        <queryResultCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0" />
        <documentCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0" />

        <enableLazyFieldLoading>true</enableLazyFieldLoading>

        <queryResultWindowSize>20</queryResultWindowSize>
        <queryResultMaxDocsCached>200</queryResultMaxDocsCached>

        <listener event="newSearcher" class="solr.QuerySenderListener" />
        <listener event="firstSearcher" class="solr.QuerySenderListener">
            <arr name="queries">
                <lst>
                    <str name="q">static firstSearcher warming in solrconfig.xml</str>
                </lst>
            </arr>
        </listener>

        <useColdSearcher>false</useColdSearcher>
        <maxWarmingSearchers>2</maxWarmingSearchers>
    </query>

    <requestDispatcher>
        <requestParsers enableRemoteStreaming="true" multipartUploadLimitInKB="2048000" />
        <httpCaching never304="true" />
    </requestDispatcher>

    <requestHandler name="/select" class="solr.SearchHandler">
        <lst name="defaults">
            <str name="echoParams">explicit</str>
            <int name="rows">4</int>
            <str name="df">name_t</str>
        </lst>
    </requestHandler>

    <requestHandler name="/update" class="solr.UpdateRequestHandler" />
    <requestHandler name="/update/csv" class="solr.CSVRequestHandler" startup="lazy" />
    <requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler" startup="lazy" />

    <queryResponseWriter name="json" class="solr.JSONResponseWriter">
        <str name="content-type">text/plain; charset=UTF-8</str>
    </queryResponseWriter>

</config>

Прямо сейчас в Broadleaf они размещают запрос для категории: 2023. ниже SolrQuery.toString выглядит как q=category%3A2003&fl=id&rows=15&fq=namespace%3Ad&start=0

Я до сих пор не могу понять, как/где имя таблицы настроено на это.

Я также хочу найти продукт по идентификатору компании. Какие изменения я должен внести для этого?

Заранее спасибо, Анкит


person Ankit    schedule 07.06.2013    source источник


Ответы (1)


Основная ссылка на документацию по этому вопросу находится по адресу http://docs.broadleafcommerce.org/current/Catalog-and-Search.html.

Основные моменты этого скопированы ниже:

Динамические поля

Эти поля задаются пользователем через записи базы данных в blc_field и blc_field_search_types. Прежде чем мы поговорим о том, что именно входит в поле, мы должны сначала рассказать, что такое динамическое поле в Solr. Если вы откроете файл schema.xml, вы увидите список множества различных полей. Далее следует краткий отрывок:

Здесь мы определяем несколько динамических полей. Например, если бы мы создали поле с именем manufactuer_s, оно было бы проиндексировано Solr как Solr.StrField.

Еще одно важное различие заключается в двух свойствах в FieldImpl: searchableFieldTypes и facetFieldType. Типы полей с возможностью поиска будут встроены в индекс Solr, и у вас может быть несколько типов. Например, вы можете захотеть проиндексировать поле как строковое поле, так и текстовое поле (текстовые поля допускают частичное совпадение). Тем не менее, вы хотели бы гранить только в поле String. Реализация Broadleaf Field дает вам эту свободу. Также обратите внимание, что поле фасета также управляет индексом Solr, используемым для сортировки.

В качестве быстрого примера давайте посмотрим, что может произойти, если у нас определены следующие поля:

производитель, facetFieldType: "s", searchableFieldTypes: { "s", "t" } defaultSku.retailPrice, facetFieldType: "d" defaultSku.name, facetField: "s", searchableFieldTypes: { "s", "t" } и мы индексируем образец продукта. Подходящим представлением Solr в JSON будет:

{ id : 100, category : [2000, 2002], Manufacturer_s : "Spice Exchange",
Manufacturer_t : "Spice Exchange",
defaultSku.retailPrice_d : 6.99, defaultSku.name_s : "Day of the Dead Scotch Bonnet Hot Sauce", defaultSku.name_t : "Острый соус ко Дню мертвых", с возможностью поиска: "Острый соус к Дню мертвых" }

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

Мы скоро вернемся к этому и посмотрим, как сортировка, поиск и огранка будут работать с этим продуктом.

Таким образом, вы определяете запись в BLC_FIELD (которая является классом FieldImpl Java), которая имеет 'companyId' для поля propertyName. Из файла load_catalog_data.sql в вашем проекте поле "производитель" импортируется для поиска следующим образом:

INSERT INTO BLC_FIELD (FIELD_ID, ENTITY_TYPE, PROPERTY_NAME, ABBREVIATION, SEARCHABLE, FACET_FIELD_TYPE) VALUES (1, 'PRODUCT', 'manufacturer', 'mfg', 1, 's');
person phillipuniverse    schedule 07.06.2013
comment
Привет, phillipuniverse, спасибо за ваш ответ, это действительно полезно. Прямо сейчас я добавляю новую запись в shema.xml для companyId ‹field name=companyId type=int indexed=true Stored=true /› и сохраняю ее в индексе solr при запуске сервера. и сейчас он работает нормально. Поскольку мы можем изменить вещи, расширив их на сайте, изменим ли мы вещи в админке также в соответствии с требованиями? Прямо сейчас я использую рабочее пространство Broadleaf 3.0, и демо-сайт не дает никакого кода для администратора. Если я хочу отследить какой-то поток по коду, как я могу это сделать? - person Ankit; 10.06.2013