Indexing SOLR不在某些字段上搜索

Indexing SOLR不在某些字段上搜索,indexing,solr,Indexing,Solr,刚刚安装了Solr,编辑了schema.xml,现在我正在尝试对其进行索引,并使用一些测试数据对其进行搜索 在我要发送给Solr的XML文件中,我的一个字段如下所示: <field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field> <field name="PageContent" type="text" indexed="true

刚刚安装了Solr,编辑了
schema.xml
,现在我正在尝试对其进行索引,并使用一些测试数据对其进行搜索

在我要发送给Solr的XML文件中,我的一个字段如下所示:

<field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field>
<field name="PageContent" type="text" indexed="true" stored="true"/>
当我运行发布工具时,一切正常,但是当我搜索
PageContent
字段中的内容时,我没有得到任何结果

但是,当我将
节点设置为
PageContent
时,它可以工作。但如果我将其设置为任何其他字段,它不会在
PageContent
中搜索

我做错什么了吗?有什么问题吗


要澄清错误,请执行以下操作:

我上传了一份包含以下数据的“文档”:

<field name="PageID">928</field>
<field name="PageName">some name</field>
<field name="PageContent"><![CDATA[<p>html content</p>]]></field>
928
某个名字
html内容

]>
在我的模式中,我定义了如下字段:

<field name="PageID" type="integer" indexed="true" stored="true" required="true"/>
<field name="PageName" type="text" indexed="true" stored="true"/>
<field name="PageContent" type="text" indexed="true" stored="true"/>

以及:

PageID
页码
现在,当我使用Solr管理工具并搜索“
somename
”时,我得到了一个结果。但是,如果我搜索“
html内容”
”、“
html
”、“
content
”或“
928
”,则不会得到任何结果


为什么?

在尝试搜索数据之前,您要确保您的数据已提交,对吗

此外,如果您想存储原始HTML,最好实际删除HTML。您可以在应用程序中或使用Solr的Solr.HTMLStripWhitespaceTokenizerFactory执行此操作,如:

<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 

在“文本”的字段类型定义中声明。您可能只想为html创建一个新的字段类型,例如text_html,您可以这样使用它:

<fieldtype name="text_html" class="solr.TextField" positionIncrementGap="100"> 
      <analyzer type="index"> 
          <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
          <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
          <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/> 
          <filter class="solr.LowerCaseFilterFactory"/> 
          <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
          <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      </analyzer> 
      <analyzer type="query"> 
          <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
          <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
          <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
          <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/> 
          <filter class="solr.LowerCaseFilterFactory"/> 
          <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
          <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      </analyzer> 
    </fieldtype> 

我不知道你说的是什么意思:

但是,当我将节点设置为 页面内容,它工作。但如果我定下来的话 对于任何其他字段,它都不会搜索 在页面内容中


您能详细说明一下吗?

您提到您的默认搜索字段设置为PageName,我不希望搜索“内容”会返回任何内容

您可能打算将“PageContent:content”放在搜索框中以查找该字段中的数据。如果你想搜索多个字段,你会想签出它。solr管理控制台并不是一个很好的工具来处理所有的Demax搜索选项,您只需要操纵URL即可

无论如何,我同意前面的海报,如果你的分析设置没有正确设置来处理HTML,你很可能会得到各种意想不到的搜索结果。去掉HTML并仅索引文本

如果希望标准查询处理程序针对所有字段进行搜索,可以在solrconfig.xml中对其进行更改(我总是添加第二个查询处理程序,而不是修改“标准”)。qf字段是要搜索的字段列表。它是一个以空格分隔的列表

<requestHandler name="standard" class="solr.DisMaxRequestHandler">

     <lst name="defaults">
            <str name="echoParams">all</str>
            <str name="hl">true</str>

            <str name="fl">*</str>
            <str name="qf">PageName PageContent</str>
     </lst>

 </requestHandler>

全部的
真的
*
页面名称页面内容

fl
是查询返回的字段列表。
qf
是您想要参考的列表,它不支持通配符


搜索所有字段而不登记它们的唯一方法是使用一个copyField来捕获所有值(不仅仅存储在索引中),然后通过在my schema.xml中搜索来模拟对所有字段的搜索。我有如下内容,它将以_t结尾的每个字段的值复制到文本字段中

<defaultSearchField>text</defaultSearchField>
<copyField source="*_t" dest="text" maxChars="3000"/>
文本

参数
fl
没有指定要查询的字段,而是指定要在响应中返回的字段

您只需添加到
schema.xml

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

 <defaultSearchField>fieldContainingEverything</defaultSearchField>

 <copyField source="*" dest="fieldContainingEverything" maxChars="3000"/>

到您的
schema.xml
。现在,当您使用
hl.true&hl.fl=*
通过dismax查询Solr时,您将
qf=fieldContainingEverything^1
添加到参数列表中。Solr现在搜索每个索引字段,但也会突出显示包含查询项的每个字段。这种方法的缺点显然是索引大小增加了在大多数情况下,我认为这不应该是那么重要。

cool cody,上面的代码真的很有用,我一定会去掉html。至于页面内容问题,我已经更新了上面的问题。非常感谢。很酷,谢谢Trey。让我直说吧。我有点困惑。所以,如果我只是发送一个搜索查询,即。“solr/?q=嗨,我住在内容节点中"SOLR将只对单个字段进行查找?当我运行示例vanilla SOLR安装程序时,我感觉像是一个简单的查询搜索所有字段?我错了吗?因为注释中没有语法突出显示,我在上面用一个建议进行了澄清。如下所述,fl是要返回的字段列表,而不是搜索的字段。-他们说标准SOLR查询解析器很愚蠢,选择Demax解析器:)开源项目通常有不好的默认值……无论出于何种原因,在qf字段中显式添加字段允许我进行搜索(当然是在重新导入之后)。所以谢谢你。我很惊讶他们没有在字段上搜索,因为我将
索引的
属性标记为TRUE,而且据我所知,我没有指定默认的搜索字段。
<field name="fieldContainingEverything"  type="text" indexed="true" stored="true"   multiValued="true" />

 <defaultSearchField>fieldContainingEverything</defaultSearchField>

 <copyField source="*" dest="fieldContainingEverything" maxChars="3000"/>
<dynamicField name="*"  type="string"  indexed="true"  stored="true"/>