我们有一个SOLR v.5.5.0服务器,我们已经加载了文档。每个SOLR字段都复制到我们要搜索的复合字段中。
例如,在我们的架构中,我们有:
<field name="Key" type="int" indexed="true" stored="true" required="true"/>
<field name="_version_" type="string" indexed="true" stored="true" multiValued="false"/>
<field name="Name" type="text_suggest_ngram" indexed="true" stored="true" required="false"/>
<field name="EmailAddress" type="text_email" indexed="true" stored="true" required="false"/>
<field name="Indexing" type="text_suggest_ngram" indexed="true" stored="true" multiValued="true"/>
大约有20个不同的领域。每个字段都复制到索引中:
<copyField source="Key" dest="Indexing"/>
<copyField source="Name" dest="Indexing"/>
<copyField source="EmailAddress" dest="Indexing"/>
自定义字段类型具有以下标记器:
<fieldType name="text_email" class="solr.TextField"/>
<fieldType name="text_suggest_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="20" minGramSize="2"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
</analyzer>
</fieldType>
因此,索引字段变为多值字段。我们使用此字段进行搜索,因为我们应该能够在所有字段中搜索一般搜索功能。
当我们将数据导入SOLR然后进行搜索时,一些记录按预期工作。例如,如果我们搜索电子邮件地址(例如select?q=Indexing%3Asomeone%40example.com
),则SOLR会提供正确的文档。
但是,在其他文档中,SOLR在搜索时提供0结果(尤其是电子邮件地址)。我们看到的是搜索secondexample@example.com
SOLR找不到任何文档,但将查询更改为secondexample
SOLR会找到该文档。将查询更改为secondexample@e
SOLR找不到任何文档。如果我们针对字段EmailAddress
(select?q=EmailAddress%3Asecondexample%40example.com
)进行字段搜索,则搜索会按预期成功。
我们不希望对特定命名字段的搜索进行编码,因为字段名称可能会发生变化,并且每次都不希望更改我们的搜索服务。
无论如何都要找出为什么SOLR没有正确搜索多值字段?
更新 示例JSON文档(内容模糊以确保安全性)“
{
"Phone": "555",
"IndexText": [
"555",
"7854",
"",
"Main App",
"16",
"Life MTG L",
"New MTG LL",
"Application",
"574",
"574",
"secondexample@example.com",
"",
"",
"M M S N",
"Open",
"P",
"3876 K E 4 O N W 2619 S B",
"",
"A",
"6055 C P E 32 L S C P B G 1501 S B",
"S I N",
"1597456 1254735"
],
"Id": "7854",
"Name": "Open",
"WP": "",
"OK": "16",
"HP": "574",
"LK": 1048808,
"FN": "",
"PN": "",
"TN": "",
"FN2": "MS",
"LN2": "M M S N",
"CL": "2",
"Type": "P",
"Laddr": "3876 K E 4 O N W 2619 S B",
"EmailAddress": "secondexample@example.com",
"LES": "A",
"PA": "6055 C P E 32 L S C P B G 1501 S B",
"LIT": "S I N",
"S": "N",
"Acc": "1597456 1254735",
"_version_": "1557490405902123010",
"score": 11.771251
}
字段和内容已根据实际数据进行了编辑,但它提供了这个想法。字段名称和内容是较长的单词。这取自SOLR管理员搜索界面。
答案 0 :(得分:0)
好的 - 所以我们的配置似乎有两个错误。
正如@femtoRgon指出的那样,克大小不正确。增加克大小然后正确地修复完整的电子邮件地址搜索。如果我们搜索完整的电子邮件地址,Solr现在可以正确找到该文档。
solr.UAX29URLEmailTokenizerFactory未在Solr 5.5.0上正确标记部分电子邮件地址。在查询secondexample@e
上使用Solr查询分析器时:
UAXURLET
text secondexample e
raw_bytes [73 65 63 6f 6e 64 65 78 61 6d 70 6c 65] [65]
start 0 14
end 13 15
positionLength 1 1
type <ALPHANUM> <ALPHANUM>
position 1 1
即使这是一个电子邮件地址,令牌系统也会生成<ALPHANUM>
类型,而不是<EMAIL>
类型。
看到我们的要求是前缀搜索,将标记生成器更改为KeywordTokenizerFactory
意味着我们现在获取完整关键字以进行前缀匹配。
另一方面,当涉及到这些事情时,Solr Admin Query分析器非常强大(使用新的东西)。