查询与字段不完全匹配的日光浴室查询
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>
我是 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>