SOLR不搜索某些字段

时间:2009-11-11 05:06:01

标签: indexing solr

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

在我发送给Solr的XML文件中,我的一个字段看起来像这样:

<field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field>

那里有HTML,所以我把它包装在CDATA中。

在我的Solr schema.xml中,该字段的定义如下:

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

当我运行POSTing工具时,一切正常,但当我搜索我知道的内容在PageContent字段内时,我没有得到任何结果。

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

我做错了吗?这是什么问题?


澄清错误:

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

<field name="PageID">928</field>
<field name="PageName">some name</field>
<field name="PageContent"><![CDATA[<p>html content</p>]]></field>

在我的架构中,我已经定义了这样的字段:

<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"/>

<uniqueKey>PageID</uniqueKey>
<defaultSearchField>PageName</defaultSearchField>

现在,当我使用Solr管理工具并搜索“some name”时,我得到了一个结果。但是,如果我搜索“html content”,“html”,“content”或“928”,则无法获得结果

为什么?

5 个答案:

答案 0 :(得分:7)

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

您可能打算在搜索框中输入“PageContent:content”来查找该字段中的数据。如果您要搜索多个字段,则需要查看http://wiki.apache.org/solr/DisMaxRequestHandler。 solr管理控制台不是一个可以使用所有DisMax搜索选项的工具,你只想操纵它的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>

答案 1 :(得分:1)

您确定在尝试搜索数据之前已经提交了数据,对吗?

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

<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 

您在“text”字段定义中声明的内容。你可能想为你的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> 

我不确定你的意思是:

  

但是,当我将节点设置为   PageContent,它的工作原理。但是,如果我设置它   到任何其他领域,它不搜索   在PageContent。

你能详细说明吗?

答案 2 :(得分:1)

fl是查询返回的字段列表。qf是您要引用的列表,它不支持通配符..

在不登记所有字段的情况下搜索所有字段的唯一方法是使用copyField捕获所有值(不是仅存储索引),然后通过搜索来模拟搜索所有字段

答案 3 :(得分:0)

在我的schema.xml中,我有类似下面的内容,它将以_t结尾的每个字段的值复制到文本字段中。

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

答案 4 :(得分:0)

参数fl执行指定要查询的字段,但指定要在响应中返回的字段。

您只需添加到schema.xml

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

 <defaultSearchField>fieldContainingEverything</defaultSearchField>

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

现在,在建立索引时,每个字段都会复制到fieldContainingEverything此处的问题是您忘记了内容来自的字段,如果您想进一步评估该信息。如果有人对此有所了解,我会很高兴。


我发现了一个有点功能性的解决方案:

使用更多细节来描述场景:我有一个MySQL数据库表,其中包含许多要索引的字段,只需导入每个字段而不指定每个字段(SELECT * FROM ...)。我想针对表的每个字段查询索引,并想知道哪个字段与查询匹配。这不是开箱即用的,因为荧光笔只是告诉您匹配查询的字段是fieldContainingEverything。通过使用 dismax 查询处理程序,我发现即使据说在每个字段中进行搜索,我似乎也无法搜索qf参数中未指定的字段。现在的想法是通过添加:

来为每个字段添加索引
<dynamicField name="*"  type="string"  indexed="true"  stored="true"/>

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

相关问题