查询与字段不完全匹配的日光浴室查询

Solarium query where query does not exactly match field

我是 Solr 6.0 和 Solarium 集成的新手。我已设置 运行 但结果未在字段执行的地方 returned 不完全匹配查询。例如,我有一个包含 'http://ayodeji.com''http://ayo-tuntun.com' 的 url 字段,但是对 'ayo' 的查询不会 return 这些行,尽管它们是 returned在 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>';
}

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

您需要使用 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>