Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SOLR copyField指令_Solr_Indexing - Fatal编程技术网

如何使用SOLR copyField指令

如何使用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

我有一个相当简单的SOLR结构,包含三个不同的字段:

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可以连接它,或者将它作为第二个值添加

但这里有几个想法可以尝试:

  • 用一个文本字段为空的文档进行实验,该文档甚至可能没有在结构下提到作为文本字段。当标签进入主文本时,文本开始时是否完全空白似乎有区别吗

  • 声明第二个字段,称之为text2。然后还通过第二个copyField指令将标记复制到text2。这个text2字段中不会有任何其他内容,可能在您的字段中甚至没有提及,因此它肯定会得到内容


  • 在这两种情况下,您都会像以前一样使用模式浏览器检查结果。我很想知道你是怎么发现的

    谢谢你的回答。我没有为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"/>