首页 > 解决方案 > Solr 通配符语法仅在搜索文本的末尾起作用?

问题描述

我已经实现了 Solr 7.6 索引并填充了它。我的第一个模式很简单......

{
"add-field": [{
    "name": "name",
    "type": "text_en",
    "indexed": true,
    "stored": true
}, {
    "name": "description",
    "type": "text_en",
    "indexed": true,
    "stored": true
}, {
    "name": "datafile-meta",
    "type": "text_en",
    "indexed": true,
    "stored": false
}, {
    "name": "datafile-content",
    "type": "text_en",
    "indexed": true,
    "stored": false
}]
}

我添加了几百个文档,知道其中两个包含“菠萝”一词。

然后我继续测试查询......

((name:pineapple)OR(description:pineapple)OR(datafile-meta:pineapple)OR(datafile-content:pineapple))

点击=2 状态=0 QTime=0

((name:pine*)OR(description:pine*)OR(datafile-meta:pine*)OR(datafile-content:pine*))

点击=2 状态=0 QTime=1

((name:*apple)OR(description:*apple)OR(datafile-meta:*apple)OR(datafile-content:*apple))

点击=0 状态=0 QTime=3

((name:p*ple)OR(description:p*ple)OR(datafile-meta:p*ple)OR(datafile-content:p*ple))

点击=0 状态=0 QTime=3

((name:p?????ple)OR(description:p?????ple)OR(datafile-meta:p?????ple)OR(datafile-content:p?????ple))

点击=0 状态=0 QTime=2

所以只有pineapplepine*返回的命中。我不明白为什么其他通配符组合:*apple,p*plep?????ple, 返回零。

我是否选择了错误的字段类型?

标签: solrschemawildcard

解决方案


从您尝试使用通配符执行的操作来看,我假设您选择了错误的类型。您正在搜索单词的字符片段,这通常使用ngrams完成。

对于你的问题,为什么这没有命中。Solr 不会在文本中出现通配符 ( *, ?) 时立即对其进行分析。但是由于您的字段使用了分析类型,因此索引的内容与查询的内容不匹配。您可以使用 Solr 实例的分析屏幕来检查这一点。

作为一般经验法则,当您开始使用通配符时,您正在做的事情可以使用正确的标记器和过滤器做得更好。当您喜欢使用通配符时,您仍然会考虑源自非索引系统的模式——例如 SQL 数据库中的查询。在我目前开发的系统中,我们很快就开始从用户输入中去除通配符,并用空格替换它们,以避免这种串通。


推荐阅读