如何使用SOLR copyField指令

时间:2011-01-04 16:45:50

标签: solr indexing

我有一个相当简单的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"/>

3 个答案:

答案 0 :(得分:29)

当文档被编入索引时,copyField就完成了,因此它位于索引分析器之前。这就像你在两个不同的领域中输入相同的输入文本一样。但在此之后,这一切都取决于您为这两个领域定义的分析器。

答案 1 :(得分:3)

如果您搜索q = tags:xyz,则找不到xyz,因为您已将其发送为未编入索引。

如果您进行默认搜索,是的,它应该根据Solr wiki

搜索副本字段
  

任意数量      声明可以包含在你的      架构,指示Solr你      希望它复制它看到的任何数据      在“源”文档字段中      已添加到索引

我认为没有将“标签”添加到索引中也会导致“标签”的副本字段无法编入索引。

答案 2 :(得分:1)

我没有尝试使用copyField将附加文本附加到现有字段。我想Solr可以连接它,或者将它作为第二个值添加。

但是这里有几个想法尝试:

  1. 尝试文档字段为空白的文档,或许甚至不在结构下提及。当标签进入主文本时,文本是否完全空白,是否会产生影响呢?

  2. 声明第二个字段,将其命名为text2。然后通过第二个copyField指令将标签复制到text2中。这个text2字段中没有任何其他内容,可能在你的字段中甚至没有提到,所以肯定它应该得到内容。

  3. 在这两种情况下,您都可以像以前一样使用架构浏览器检查结果。我很想知道你是怎么发现的!