Сопоставление XML-поля структурированного содержимого OpenCMS с полем SOLR

Мы пытаемся сопоставить XML-поле структурированного контента OpenCMS с полем SOLR, чтобы выполнить поиск, используя это поле в качестве фильтра.

Поле XML описывается следующим образом в файле XSD:

<xsd:complexType name="OpenCmsContrato">
    <xsd:sequence>
    [...]
        <xsd:element name="numeroExpediente" type="OpenCmsString" minOccurs="1" maxOccurs="1" />
    [...]
    </xsd:sequence>
    <xsd:attribute name="language" type="OpenCmsLocale" use="required"/>
</xsd:complexType>

А это настройки поиска элемента, определенные в том же XSD-файле:

<xsd:annotation>
    <xsd:appinfo>
    [...]
        <searchsettings>
            <searchsetting element="numeroExpediente" searchcontent="true">
                <solrfield targetfield="numexp" />
            </searchsetting>
        </searchsettings>
    [...]
    </xsd:appinfo>
</xsd:annotation>

Целевое поле SOLR "numexp" определяется следующим образом в файле SOLR schema.xml:

<fields>
    <field name="numexp"                 type="string"       indexed="true"  stored="true" />
    [...]
</fields>

И вот как мы выполняем запрос к SOLR в файле JSP:

CmsSearchManager manager = OpenCms.getSearchManager();
CmsSolrIndex index = manager.getIndexSolr("Solr Online");

String query = "fq=type:contrato";

if (!"".equals(text))
    query += "&fq=numexp:" + text;

CmsSolrResultList listFiles = index.search(cmso, query);

Когда мы выполняем этот код, мы получаем listFiles.size() = 0, но когда мы меняем поле фильтра на предопределенное поле SOLR «контент», следующим образом:

if (!"".equals(text))
    query += "&fq=content:" + text;

получаем ожидаемый результат.

С объектом CmsSearchResource, который мы получаем, используя поле SOLR «content» в качестве фильтра, мы можем перебирать поля его внутреннего I_CmsSearchDocument, получая в результате этот список:

id
contentblob
path
type
suffix
created
lastmodified
contentdate
relased
expired
res_locales
con_locales
template_prop
default-file_prop
notification-interval_prop
NavPos_prop
enable-notification_prop
locale_prop
NavText_prop
Title_prop
category
ca_excerpt
timestamp
score
link

Отсутствие поля "numexp" в списке. Почему? Мы пропустили какой-либо шаг? Нужно ли нам настраивать что-то еще, чтобы сопоставление работало?


person Arturo    schedule 23.01.2013    source источник
comment
@dove Интересно, почему вы отредактировали сообщение, чтобы удалить его, спасибо заранее ...   -  person spekdrum    schedule 23.01.2013
comment
@Spekdrum этот вопрос и ответы на него в мета meta.stackexchange.com/questions/2950/ подводит итог довольно хорошо. дело не в том, что ваша благодарность не приветствуется, надеюсь, вы научитесь любить тонко утонченный этикет stackoverflow и научитесь ценить и вносить свой вклад.   -  person dove    schedule 23.01.2013
comment
Извините, я не понял, что разговариваю с роботом.   -  person spekdrum    schedule 27.02.2013


Ответы (2)


Несколько месяцев назад у меня была такая же проблема. я думаю это твоя проблема

<searchsetting element="numeroExpediente" searchcontent="true">
     <solrfield targetfield="numexp" />
</searchsetting>

вы должны изменить на это

<searchsetting element="numeroExpediente" searchcontent="true">
     <solrfield targetfield="numexp" sourcefield="*_s" />
</searchsetting>

Вы должны установить тип поля solr, взглянуть на разные типы в schema.xml SOLR, я делаю это для некоторой категории в элементе блога. Работа в версии 9.0.1

person FAC    schedule 04.07.2014

У нас была такая же проблема. Дело в том, что SOLR не будет индексировать вложенное содержимое само по себе, вы должны сказать, следует ли индексировать поле или нет.

Например, предположим, что у нас есть XSD события, содержащий информацию о событии и компании:

<xsd:complexType name="OpenCmsEvent">
    <xsd:sequence>
        <xsd:element name="EventInformation" type="OpenCmsEventInformation" minOccurs="1" maxOccurs="1" />
        <xsd:element name="EventHost" type="OpenCmsEventHost" minOccurs="0" maxOccurs="1" />
    </xsd:sequence>
    <xsd:attribute name="language" type="OpenCmsLocale" use="required" />
</xsd:complexType>

Мы хотим знать ссылки на компании от Eventhost

<xsd:complexType name="OpenCmsEventHost">
    <xsd:sequence>
        <xsd:element name="company" type="OpenCmsVfsFile" minOccurs="1" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="language" type="OpenCmsLocale" use="optional" />
</xsd:complexType>

Следующее сопоставление даст нам информацию, которую мы хотим

<searchsettings>
    <searchsetting element="EventHost/company" searchcontent="true">
            <solrfield targetfield="companyurl"/>
    </searchsetting>
</searchsettings>

Делая это на существующих ресурсах, не забудьте переиндексировать свой солнечный индекс!

person TeaTime    schedule 04.12.2017
comment
Теперь он возвращает содержимое companyurl. Как получить многозначные поля? Если OpenCmsEventHost снова содержит вложенные элементы, и я хочу использовать ту же структуру, которую я определил в OpenCmsEventHost. Является ли это возможным? Также можно сопоставить несколько элементов с одним и тем же полем solrfield? - person Princey James; 12.03.2018
comment
‹searchsetting element=EventHost/company/yournested searchcontent=true› ‹solrfield targetfield=yourmultivalue/› ‹/searchsetting› это должно помочь. вам придется снова объявить путь к вложенному ресурсу, начиная с верхнего уровня (Eventhost) - person TeaTime; 13.03.2018
comment
Если я не использую атрибут sourcefield в своем solrfield, ничего не возвращается. Что, если вложенный тип представляет собой сложный тип с несколькими полями? Я разместил вопрос по адресу stackoverflow.com/questions/49239311/. Пожалуйста, взгляните. Спасибо. - person Princey James; 13.03.2018