Solr search server:如何从要索引的内容中剥离HTML实体

Solr search server:如何从要索引的内容中剥离HTML实体,solr,django-haystack,Solr,Django Haystack,我是Solr的新手,对Java没有任何技能,因此可能我遗漏了一些东西……我正试图让Solr使用以下CharFilter从内容中剥离HTML: 以下是我将其包含到schema.xml中的方式: <fieldType name="text" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <charFilter class="solr.HTMLStripC

我是Solr的新手,对Java没有任何技能,因此可能我遗漏了一些东西……我正试图让Solr使用以下CharFilter从内容中剥离HTML:

以下是我将其包含到schema.xml中的方式:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <charFilter class="solr.HTMLStripCharFilterFactory"/>
    <tokenizer class="solr.StandardTokenizerFactory"/>
  </analyzer>
  <analyzer type="query">
    <charFilter class="solr.HTMLStripCharFilterFactory"/>
    <tokenizer class="solr.StandardTokenizerFactory"/>
  </analyzer>
</fieldType>

<fields>
  <field name="text" type="text" indexed="true" stored="true" multiValued="false" />
</fields>

如果我使用Solr admin面板上的分析器查询“d'Hèrcules”,我会得到一个匹配项(参见字段):


0
剧院
超时工作
2535
假的
0
超时。工作。2535
卢克尔斯大道酒店
伊塞纳
0
假的
伊塞纳婴儿
第39大街;赫鲁克勒斯·乔迪和奥贾尔·普雷帕鲁·沃斯通过一个安提加·格里西亚(l'antiga Grècia)讲述了《时代英雄:赫鲁克勒斯》(l'Hèrcules gran de tots els temps:l'Hèrcules)。这是一座圣殿,这是一座通往无尽复仇之路的英雄之城,这是一座充满危险的修道院,这是一座通往死亡之门的大门。每一个家庭/p
...
但我需要通过搜索非HTML实体表单进行匹配:例如,在本例中,将是“l'Hèrcules”(注意单引号)

我做错了什么

顺便说一下,如果这些信息在任何方面有用的话,我正在使用django haystack

提前感谢,


赫克托

你在Solr方面做得很好,你唯一应该注意的是Solr存储的内容和Solr索引之间存在差异。Solr按原样存储数据,而无需修改任何内容,而通过analyzer链,您可以更改Solr索引数据的方式。 因此,您实际上是在告诉Solr从索引中删除任何html标记,并用相关字符替换html实体,但Solr在您提交它们时将始终返回它们

您可以搜索
d'Hèrcules
d';Hèrcules
您应该得到相同的结果,因为即使在查询时也会触发
HtmlStripCharFilterFactory
,因此在这两种情况下,您基本上都是为
d'Hèrcules
提交相同的查询,因为
和#39转换为


你对
l'Hèrcules
的搜索让我觉得你的文档中
l
Hercules
之间未替换的字符不是
,而是看起来非常相似的东西。我认为您应该检查一下。

您在Solr方面做得很好,您应该注意的唯一一点是,Solr存储的内容和Solr索引之间存在差异。Solr按原样存储数据,而无需修改任何内容,而通过analyzer链,您可以更改Solr索引数据的方式。 因此,您实际上是在告诉Solr从索引中删除任何html标记,并用相关字符替换html实体,但Solr在您提交它们时将始终返回它们

您可以搜索
d'Hèrcules
d';Hèrcules
您应该得到相同的结果,因为即使在查询时也会触发
HtmlStripCharFilterFactory
,因此在这两种情况下,您基本上都是为
d'Hèrcules
提交相同的查询,因为
和#39转换为


你对
l'Hèrcules
的搜索让我觉得你的文档中
l
Hercules
之间未替换的字符不是
,而是看起来非常相似的东西。我想你应该检查一下。

对不起,也许是我,但我真的不知道哪里出了问题,也不知道你想要实现什么。你能澄清你的问题吗?@javanna好吧,基本上我想搜索“d'Hèrcules”并匹配包含它的数据。。。问题是,源内容有HTML实体(在本例中,它有“d';Hèrcules”),当我对其进行索引时,Solr将其“按原样”存储,因此我只能在使用完全相同的字符串(即“d';Hèrcules”)进行查询时进行匹配。该HTML存在于何处?在文件系统中?您可以使用“发布”HTML或任何类型的丰富文档(doc、pdf)。它将从HTML中提取文本并为您编制索引。对不起,我没有注意到您的问题(部分)是非拉丁字符。YMMV:-)对不起,也许是我,但我真的不知道哪里出了问题,也不知道你想要实现什么。你能澄清你的问题吗?@javanna好吧,基本上我想搜索“d'Hèrcules”并匹配包含它的数据。。。问题是,源内容有HTML实体(在本例中,它有“d';Hèrcules”),当我对其进行索引时,Solr将其“按原样”存储,因此我只能在使用完全相同的字符串(即“d';Hèrcules”)进行查询时进行匹配。该HTML存在于何处?在文件系统中?您可以使用“发布”HTML或任何类型的丰富文档(doc、pdf)。它将从HTML中提取文本并为您编制索引。对不起,我没有注意到您的问题(部分)是非拉丁字符。YMMV then:-)我同意,如果您根本不希望HTML出现,那么您需要在发送到Solr之前在另一个进程中将其删除,或者在从Solr获得响应之后对其进行解析。我们遇到了类似的问题,并选择在为内容编制索引之前删除HTML标记。我同意,如果您根本不希望HTML出现,则需要在发送到Solr之前的另一个过程中将其删除,或者在从Solr获得响应后对其进行解析。我们也遇到了类似的问题,选择在索引内容之前删除HTML标记。
<doc>
<long name="comment_count">0</long>
<str name="ct_model_name">theatre</str>
<str name="django_ct">timeout.work</str>
<str name="django_id">2535</str>
<bool name="family">false</bool>
<long name="hits">0</long>
<str name="id">timeout.work.2535</str>
<str name="name">Les aventures d'Hèrcules</str>
<arr name="parent_sections">
<str>Escena</str>
</arr>
<long name="rating">0</long>
<bool name="recommended">false</bool>
<arr name="sections">
<str>Escena - Infantil</str>
</arr>
<str name="text">
Les aventures d&#39;Hèrcules Jordi Andújar &lt;p&gt;Prepareu-vos per viatjar a l’antiga Grècia on coneixereu l’heroi més gran de tots els temps: l’Hèrcules. De viatge cap a l’Olimp, l’heroi viurà les més increïbles aventures, lluitarà amb bèsties ferotges i perillosos monstres, i s’enfrontarà a la maldat de la temible deessa Hera. Per a tota la família&lt;/p&gt;
</str>
...
</doc>