0

我是 Solr 6.0 和 Solarium 集成的新手。我的设置正在运行,但在字段与查询不完全匹配的地方没有返回结果。例如,我有一个包含 url 的字段,'http://ayodeji.com'或者'http://ayo-tuntun.com'对“ayo”的查询不会返回这些行,尽管它们是*:*在 Solr 管理部分中与查询一起返回的。我已将托管模式文件中的字符串更改为文本,但仍然无法正常工作。请帮助 下面是我正在使用的 Solarium dismax 示例中的代码。谢谢你。

    $client = new Solarium\Client($config);

$query = $client->createSelect();

$dismax = $query->getDisMax();

$dismax->setQueryFields('url^5 author^3 body^1 title');

$searchTerm = 'ayo';

$query->setQuery($searchTerm);

$resultset = $client->select($query);

echo 'NumFound: '.$resultset->getNumFound();

foreach ($resultset as $document) {

    echo '<hr/><table>';

    // the documents are also iterable, to get all fields
    foreach ($document as $field => $value) {
        // this converts multivalue fields to a comma-separated string
        if (is_array($value)) {
            $value = implode(', ', $value);
        }
        echo '<tr><th>' . $field . '</th><td>' . $value . '</td></tr>';
    }
    echo '</table>';
}
4

2 回答 2

1

您需要使用 WordDelimiterFilter 将 url 按小部分拆分。

https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

 <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="1" catenateWords="1" types="wdfftypes.txt"
            generateNumberParts="1" catenateNumbers="1" splitOnNumerics="1"
            catenateAll="1" splitOnCaseChange="1" 
            stemEnglishPossessive="0" preserveOriginal="0" />
    </analyzer>

我附上了一张测试结果的图片。

在此处输入图像描述

在分析工具的左侧,您可以看到 ayo 关键字已匹配。

我的 text_general fieldType 示例

 <fieldType name="text_general" class="solr.TextField" omitNorms="false"  positionIncrementGap="100" multiValued="true">
    <analyzer type="index">
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
     <filter class="solr.LowerCaseFilterFactory"/>
     <filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
     <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="1" catenateWords="1" types="wdfftypes.txt"
            generateNumberParts="1" catenateNumbers="1" splitOnNumerics="1"
            catenateAll="1" splitOnCaseChange="1" 
            stemEnglishPossessive="0" preserveOriginal="0" />
    </analyzer>
    <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="1" catenateWords="1" types="wdfftypes.txt"
            generateNumberParts="1" catenateNumbers="1" splitOnNumerics="1"
            catenateAll="1" splitOnCaseChange="1"
            stemEnglishPossessive="0" preserveOriginal="0" />
    </analyzer>
  </fieldType>
于 2016-04-12T09:47:52.587 回答
0

Solr 不搜索子字符串。即:搜索“ello”找不到包含“helloworld”的文档是正常行为。如果你愿意,你应该使用*ello*它作为搜索字符串。

于 2016-04-12T09:30:10.580 回答