solr - 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
所以只有pineapple
和pine*
返回的命中。我不明白为什么其他通配符组合:*apple
,p*ple
和p?????ple
, 返回零。
我是否选择了错误的字段类型?
解决方案
从您尝试使用通配符执行的操作来看,我假设您选择了错误的类型。您正在搜索单词的字符片段,这通常使用ngrams完成。
对于你的问题,为什么这没有命中。Solr 不会在文本中出现通配符 ( *
, ?
) 时立即对其进行分析。但是由于您的字段使用了分析类型,因此索引的内容与查询的内容不匹配。您可以使用 Solr 实例的分析屏幕来检查这一点。
作为一般经验法则,当您开始使用通配符时,您正在做的事情可以使用正确的标记器和过滤器做得更好。当您喜欢使用通配符时,您仍然会考虑源自非索引系统的模式——例如 SQL 数据库中的查询。在我目前开发的系统中,我们很快就开始从用户输入中去除通配符,并用空格替换它们,以避免这种串通。
推荐阅读
- android - 在 Android Studio 2.3.3 中更新到 gradle 3.2.1 不起作用
- python - 为什么我的Trackbar的值总是-1
- lisp - Lisp 3的倍数之和
- sml - SML:从元组列表中创建一个列表,每个元组的第二个元素
- python - Python:“NoneType”对象不可下标“错误
- php - PHP 持久延迟 HTTP 连接
- php - 在 laravel 6 上安装 Doctrine 失败
- javascript - 如何将 Child_process.spawn 的“Promise”语法转换为“async/await”语法
- python - 在 QFileDialog.getExistingDirectory Pyqt5 中按数字排序
- javascript - 如何在 ES6 中使用可选参数扩展构造函数+方法?