我们正在尝试将OpenCMS结构化内容XML字段映射到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>
这是我们在JSP文件上对SOLR执行查询的方式:
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,但是当我们将filter字段更改为预先设定的SOLR字段“content”时,这样:
if (!"".equals(text))
query += "&fq=content:" + text;
我们得到了预期的结果。
使用CmsSearchResource对象,我们使用“content”SOLR字段作为过滤器,我们可以迭代其内部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”字段。为什么? 我们错过任何一步吗?我们是否必须配置其他内容才能使映射有效?
答案 0 :(得分:2)
几个月前,我遇到了同样的问题。 我认为这是你的问题
<searchsetting element="numeroExpediente" searchcontent="true">
<solrfield targetfield="numexp" />
</searchsetting>
你必须改为这个
<searchsetting element="numeroExpediente" searchcontent="true">
<solrfield targetfield="numexp" sourcefield="*_s" />
</searchsetting>
你必须设置solrfield的类型,看看不同的类型,在SOLR的schema.xml中,我为blog元素中的某个类别执行此操作。在v9.0.1中工作
答案 1 :(得分:1)
我们遇到了同样的问题。问题是SOLR不会自己索引嵌套内容,你必须说明该字段是否应该被编入索引。
对于Instance,假设我们有一个事件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>
在现有资源上执行此操作时,不要忘记重新编制太阳能指数!