0

我是 Solr 的新手,我开发了一个分组搜索,它应该按 object_class 对搜索结果进行分组(每个数据库表都有一个像 User、Artist 等对象)。

现在我正在尝试构建一个搜索,它应该在标题、副标题、内容和传记等字段中进行搜索。

对于每个对象,我都有一个不同的搜索查询(因为使用 solr 在分组结果时您无法实现不同的排序顺序)。

问题:有一个标题为“Cuebrick”的艺术家。现在通常在搜索 Cueb 甚至标题:Cueb* 时应该可以找到它,但这不起作用。

就像在屏幕截图中一样,您可以看到我正在搜索 Cueb、headline:cueb* 和 header:cuebrick 以及 object_class:Artist ( ... AND ... )。

为什么我的“喜欢”查询不起作用?

询问:cueb AND object_class:Artist

查询1不工作

询问:headline:cueb* AND object_class:Artist

查询2不工作

询问:headline:cuebrick AND object_class:Artist

查询3正确的结果

我的架构的重要部分如下所示:

<field name="headline" type="text_de" indexed="true" stored="true" stripHTML="true" />
(... same for content, subtitle and biography)


<defaultSearchField>text</defaultSearchField>

<copyField source="headline" dest="text"/>
<copyField source="content" dest="text"/>
<copyField source="keywords" dest="text"/>
<copyField source="subtitle" dest="text"/>
<copyField source="biography" dest="text"/>

这里是我的 text_de 定义(现在改变了,我必须重新索引吗?重启没有改变任何东西):

<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_de.txt" enablePositionIncrements="true" />
    <filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="1" splitOnNumerics="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.SnowballPorterFilterFactory" language="German2" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_de.txt" enablePositionIncrements="true" />
    <filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="1" splitOnNumerics="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.SnowballPorterFilterFactory" language="German2" />
  </analyzer>
</fieldType>
4

1 回答 1

3

由于 filter class="solr.SnowballPorterFilterFactory" language="German2 " ,令牌“ cuebrick ”将作为“ cubrick ”存储在您的索引中。

您的查询标题:cueb * 是通配符查询。通配符查询不会对您作为查询提供的文本执行任何分析。因此它将搜索带有前缀“cueb”的令牌并且找不到任何匹配项,因为您的索引令牌是“ cubrick ”。

将您的查询更改为标题:cub * 并检查结果。

于 2013-08-22T10:27:02.183 回答