Solr查询-如何解决未预期的结果(可能特定于文化)?

时间:2019-04-11 12:13:41

标签: solr sitecore solrnet

我在sitecore应用程序中将搜索提供程序从lucene切换为solr。 solr的sitecore中有一些添加到schema.xml中。我正在使用solr 6.6.3。 更改成功,但某些搜索结果与以前不同。

示例: 搜索德语单词“ Trommelfilter”将不会返回任何结果。 搜索德语单词“ Trommelfilt”将返回预期结果。

似乎“ er”可能已在内部删除。 也许是某些文化特定的问题?

我再次直接运行搜索,但是问题仍然存在。

Solr查询1: searchcontent_t_de:(*Trommelfilt*) 结果:

{
  "responseHeader":{
    "status":0,
    "QTime":4,
    "params":{
      "q":"searchcontent_t_de:(*trommelfilt*)",
      "indent":"on",
      "wt":"json",
      "_":"1554983614349"}},
  "response":{"numFound":0,"start":0,"docs":[]
  }}

Solr查询2: searchcontent_t_de:(*Trommelfilter*) 结果:

{
  "responseHeader":{
    "status":0,
    "QTime":8,
    "params":{
      "q":"searchcontent_t_de:(*Trommelfilt*)",
      "indent":"on",
      "wt":"json",
      "_":"1554983656940"}},
  "response":{"numFound":1,"start":0,"docs":[
      {
        ...
        "_templatename":"Application",
        "culture_s":"de-DE",
        "_database":"master",
        "searchcontent_t_de":"... einen Trommelfilter gereinigt. ...",
        "_language":"de-DE",
        ...
}}

这是负责在solr中为受影响的核心配置的架构的代码。 “ searchcontent_t_de”的配置是通过dynamicField进行的。

<dynamicField name="*_t_de" type="text_de" indexed="true" stored="true" />
...
<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball" />
        <filter class="solr.GermanNormalizationFilterFactory" />
        <filter class="solr.GermanLightStemFilterFactory" />
        <!-- less aggressive: <filter class="solr.GermanMinimalStemFilterFactory"/> -->
        <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="German2"/> -->
      </analyzer>
</fieldType>

我想知道我必须做哪些更改才能获得预期的结果(应该找到完整的词)。

1 个答案:

答案 0 :(得分:2)

通配符搜索不会对已配置的分析链执行任何步骤-当您使用通配符(*)时,将跳过这些步骤。

这也是为什么您没有获得成功的原因,因为存储令牌时会出现词干过滤器-这会从存储的令牌中删除er

带通配符:在索引中:trommelfilt-在搜索中:*trommelfilter*。它们不匹配-由于存储的令牌没有er,并且在存在通配符时不会进行删除,因此不会生成匹配项。

如果您删除通配符(即仅搜索trommelfilter),您将大获成功,因为在建立索引和查询时都会进行相同的处理。查询字符串也将只处理为trommelfilt,与索引中的trommelfilt令牌匹配。