我有一个相当简单的SOLR结构,它包含三个不同的领域:
id,文字和标签
在schema.xml
我设置了以下内容
<uniqueKey>id</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
<copyField source="tags" dest="text"/>
但是,当我搜索仅显示为标记的单词时,则找不到该文档。
我的问题是:copyField是在任何分析器运行(索引和查询)之前发生的,如here所述,还是在查询分析器之前?
修改
分析仪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>
和字段类型定义(它们几乎是默认配置):
<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
并持续字段定义:
<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"/>
答案 0 :(得分:29)
当文档被编入索引时,copyField就完成了,因此它位于索引分析器之前。这就像你在两个不同的领域中输入相同的输入文本一样。但在此之后,这一切都取决于您为这两个领域定义的分析器。
答案 1 :(得分:3)
如果您搜索q = tags:xyz,则找不到xyz,因为您已将其发送为未编入索引。
如果您进行默认搜索,是的,它应该根据Solr wiki
搜索副本字段任意数量 声明可以包含在你的 架构,指示Solr你 希望它复制它看到的任何数据 在“源”文档字段中 已添加到索引
我认为没有将“标签”添加到索引中也会导致“标签”的副本字段无法编入索引。
答案 2 :(得分:1)
我没有尝试使用copyField将附加文本附加到现有字段。我想Solr可以连接它,或者将它作为第二个值添加。
但是这里有几个想法尝试:
尝试文档字段为空白的文档,或许甚至不在结构下提及。当标签进入主文本时,文本是否完全空白,是否会产生影响呢?
声明第二个字段,将其命名为text2。然后通过第二个copyField指令将标签复制到text2中。这个text2字段中没有任何其他内容,可能在你的字段中甚至没有提到,所以肯定它应该得到内容。
在这两种情况下,您都可以像以前一样使用架构浏览器检查结果。我很想知道你是怎么发现的!