apache - Solr 按文本搜索
问题描述
我在通过查询在 Solr 中搜索文档时遇到问题。
该文档如下所示:
{
"id": "890_03366_00739",
"text": ["2509412 MARCO GLLMRC86E28L736X 03366 00739 "],
"_version_": 1612212288969769000
}
如果我使用查询进行搜索,text:GLLMRC86E28L736
我会正确找到该文档。
如果我尝试查询text:GLLMRC86E28L736X
我找不到文档,为什么会发生这种情况?
在我的模式中,该字段text
被声明为<field name="text" type="text_general" indexed="true" required="true" stored="true"/>
我使用的是 Solr 7.0.0。
更新:
“分析”页面显示我的字段“文本”的输出并查询 GLLMRC86E28L736X
查询 GLLMRC86E28L736
搜索 GLLMRC86E28L736X
搜索 GLLMRC86E28L736
字段类型“text_general”声明为
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="15" minGramSize="2"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
解决方案
您的 EdgeNgramFilter 有一个maxGramSize
设置可以切断令牌的结尾 - X 在索引时被删除,而在查询时被保留(如果您尝试匹配前缀,它应该如此)。
在分析屏幕的左侧,您可以看到它生成了 的版本GLLMRC86E28L736X
,但最后一个字符被删除了 - 即它在添加最后一个字符之前停止生成版本。查询仍然是GLLMRC86E28L736X
,并且由于没有令牌匹配GLLMRC86E28L736X
(只是GLLMRC86E28L736
因为它在生成之后停止了),所以您不会受到任何影响。
如果您只想获得完全匹配,请为您的字段调整maxGramSize
,或搜索不执行任何边图的字段。
此外,text_general
如果我没记错的话,这不是示例中包含的字段类型的默认形式,因此将来如果您也包含该字段类型会很有帮助。
推荐阅读
- ruby-on-rails - 删除 add_column 文件后 Heroku 数据库中缺少列
- javascript - 从格式中提取经纬度 (47.35275, 8.55709)
- node.js - 启用 aws-xray serverless.yml
- python - 需要有关在 for 循环中打印列表的帮助
- ios - 在 StoryBoard 中调整集合视图标题的大小
- python-3.7 - 如何在字符串中间连接变量?
- python-3.x - 如何在Python中慢慢画一条线
- php - 如何确定一行的某个项目,然后用它执行查询?
- java - 当我在不同的活动中时如何从 ImageView 更改图像
- javascript - 问题嵌套映射与数组反应