我在为子字符串创建 Solr 搜索时遇到问题。例如,当用户搜索“Alfa Romeo Land Car”时,我只想匹配完整的品牌(只匹配“Alfa Romeo”,而不是“Land Rover”)。我尝试这样做的方法是从我的查询中创建带状疱疹,然后尝试与我的“汽车品牌”Solr 核心进行完全匹配。
因此,如果用户搜索“AB C”,我想获得带状疱疹 [A, AB, ABC, B, BC, C]。
但是当我使用下面的 Solr 配置时,当我搜索“AB C”(使用 EDisMax 或标准查询解析器)时,Solr 什么也不返回,但如果搜索“ABC”,我会得到匹配结果“ABC”。
这是我的 schema.xml 文件:
<field name="id" type="tint" indexed="true" stored="true" required="true"/>
<field name="name" type="text_exact" indexed="true" stored="true" required="true"/>
<field name="seoAlias" type="string" indexed="true" stored="true" required="true"/>
<fieldType name="text_exact" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="0" generateWordParts="0" catenateAll="1" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="0" generateWordParts="1" catenateAll="0" />
<filter class="solr.ShingleFilterFactory" outputUnigrams="true" outputUnigramsIfNoShingles="true" tokenSeparator="" maxShingleSize="5"/>
</analyzer>
</fieldType>
以下是我的 Solr 核心中的文档:
"response": {
"numFound": 7,
"start": 0,
"docs": [
{
"id": 1,
"name": "A B C D",
"seoAlias": "abce",
"_version_": 1524585748644233200
},
{
"id": 2,
"name": "A B C",
"seoAlias": "abce",
"_version_": 1524586301229105200
},
{
"id": 3,
"name": "B C D",
"seoAlias": "abce",
"_version_": 1524586311147585500
},
{
"id": 4,
"name": "A B",
"seoAlias": "abce",
"_version_": 1524586322261442600
},
{
"id": 5,
"name": "B C",
"seoAlias": "abce",
"_version_": 1524586329997836300
},
{
"id": 6,
"name": "C D",
"seoAlias": "abce",
"_version_": 1524586338173583400
},
{
"id": 7,
"name": "B",
"seoAlias": "abce",
"_version_": 1524652609127841800
}
]
},
在 Solr 管理网页中,如果我转到“模式浏览器”,然后选择有问题的字段,然后按“加载术语信息”,我可以看到以下索引术语:
6
/6 Top-Terms:
1
ABC
ABCD
BC
BCD
CD
AB
当我搜索“AB C”时,我想要以下带状疱疹 [ABC AB BC ABC] 但从调试查询中我得到:
"response": {
"numFound": 0,
"start": 0,
"docs": []
},
"debug": {
"rawquerystring": "*:*",
"querystring": "*:*",
"parsedquery": "MatchAllDocsQuery(*:*)",
"parsedquery_toString": "*:*",
"explain": {},
"QParser": "LuceneQParser",
"filter_queries": [
"name:\"A B C\""
],
"parsed_filter_queries": [
"**MultiPhraseQuery**(name:\"(A AB ABC) (B BC) C\")"
],
我认为问题可能与MultiPhraseQuery有关。它创建了看似正确的带状疱疹,但似乎 Solr 不使用这些字符串进行搜索。有人知道我错过了什么吗?
非常感谢提前