如何使用SOLR copyField指令
我有一个相当简单的SOLR结构,包含三个不同的字段: id、文本和标记 在如何使用SOLR copyField指令,solr,indexing,Solr,Indexing,我有一个相当简单的SOLR结构,包含三个不同的字段: id、文本和标记 在schema.xml中,我设置了以下内容 <uniqueKey>id</uniqueKey> <defaultSearchField>text</defaultSearchField> <solrQueryParser defaultOperator="AND"/> <copyField source="tags" dest="text"/> id
schema.xml
中,我设置了以下内容
<uniqueKey>id</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
<copyField source="tags" dest="text"/>
id
文本
但是,当我搜索仅显示为标记的单词时,则找不到文档
我这里的问题是:copyField是在任何分析器运行(索引和查询)之前发生的,还是在查询分析器之前发生的
编辑 分析仪def:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.SnowballPorterFilterFactory" language="German" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.SnowballPorterFilterFactory" language="German" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
字段类型定义(与默认配置基本相同):
最后是字段定义:
<fields>
<field name="id" type="string" indexed="true" stored="true" required="true" />
<field name="text" type="text" indexed="true" stored="false" multiValued="true" />
<field name="tags" type="text" indexed="false" stored="false" />
</fields>
<uniqueKey>id</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
<copyField source="tags" dest="text"/>
身份证件
文本
对文档编制索引时,复制字段完成,因此它位于索引分析器之前。这就像你在两个不同的字段中输入了相同的文本。但在此之后,这一切都取决于您为这两个字段定义的分析器。如果您搜索q=tags:xyz,那么将找不到xyz,因为您发送了它,但没有索引
如果您执行默认搜索,是的,它应该根据
任意数量
声明可以包含在您的
schema,以指示Solr
希望它复制它看到的任何数据
在文档的“源”字段中
添加到索引中的
我认为没有将“标记”添加到索引中也会导致“标记”的copyfield没有被索引。我没有尝试使用copyfield向现有字段添加额外的文本。我想Solr可以连接它,或者将它作为第二个值添加 但这里有几个想法可以尝试:
在这两种情况下,您都会像以前一样使用模式浏览器检查结果。我很想知道你是怎么发现的 谢谢你的回答。我没有为tags字段定义任何分析器,因为没有必要对不同于正常文本的标记进行评分。我只是将标记的内容复制到文本中,让索引器运行该字段->我做了一些错误,因为它不起作用。请发布您的字段定义。好的,首先:当您在solr中浏览内容时,您是否在“文本”字段中看到数据?您是指
架构浏览器
?是,文本字段中约有2500个文档。如上所述,文本查询按预期工作-只是标记不在其中,我的意思是执行“/select?q=*:*”查询。“标记”和“文本”字段中都有数据吗。另外,检查你的指数化过程。是否确实要将数据添加到“标记”字段?如果你正在做一个从“标签”到“文本”的复制域,你必须向“标签”添加数据。谢谢你的回答。我将其更改为
,但结果并没有对defaultSearchField进行仔细更改:“最好不要使用或依赖此设置;相反,搜索的请求处理程序或查询LocalParams应该指定要搜索的默认字段。此处可以省略此设置,并考虑对其进行弃用。”从文件中:
<fields>
<field name="id" type="string" indexed="true" stored="true" required="true" />
<field name="text" type="text" indexed="true" stored="false" multiValued="true" />
<field name="tags" type="text" indexed="false" stored="false" />
</fields>
<uniqueKey>id</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
<copyField source="tags" dest="text"/>