web - Solr:在关键字中搜索带/不带空格
问题描述
我在关键字中引入空格时遇到问题,例如:
我们有一个标题为“Sony Playstation 4 Camera V2 PS4 (PSVR)”的产品
搜索“playstation”或“playstation camera”会返回此产品
搜索“play station”或“play station camera”不会带回该产品(注意空格)
这是正在使用的 fieldType:
<fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.HyphenatedWordsFilterFactory"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" preserveOriginal="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.HyphenatedWordsFilterFactory"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" preserveOriginal="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
我该如何解决这个问题,并使“playstation”和“play station”都匹配?对于我的示例,这仅限于 PlayStation,但它可能发生在任何搜索词上,例如“cyberpunk”、“cyber punk”。因此,需要大量手动工作(例如添加同义词)的解决方案play station => playstation
是不可行的。
我尝试过但没有成功的事情:
- N-GRAM 过滤器和标记器
- 模糊搜索
- 删除空格
- 转义空格
解决方案
您可以使用Shingle 过滤器将多个令牌合并为一个。
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.HyphenatedWordsFilterFactory"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" preserveOriginal="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ShingleFilterFactory"/>
</analyzer>
如果您假设在编制索引时术语拼写正确,则只能在查询时应用。它将为您连接令牌,有效地为您提供多个“合并”令牌:
play station camera => play, station, camera, playstation, stationcamera
..给定maxShingleSize=2
。如果您将最大大小增加到 3,这也会给您playstationcamera
一个单一的令牌(在这种情况下)。如果您有一些术语,人们可能会多次拆分一个单词,那么这可能是必要的。
如果您假设您的术语已正确编入索引,并且仅在查询时需要这样做,那么您的索引将不会更改,您也不必重新索引(并且大小不会更改)。
您可能需要更改过滤器的位置;你的词干过滤器会在神秘的地方打破这个,因为你最终会连接以前的词干。
推荐阅读
- c# - UWP 独立滚动视图
- java - 在 Float 和 Integer 数组中查找最大元素索引的常用方法
- python - 用于从 SVD 部分重建图像的快速 NumPy 表达式
- git - 如何在 Visual Studio Code 的 git diff 中为移动的线条着色
- python - 如何在 LIME 中使用具有两个输入的模型来解释文本分类
- php - 使用 html 按钮运行 sudo 命令
- java - 使用父类getter java在子类中填充数组
- mysql - 错误代码:1064。内部连接出现问题
- flutter - Flutter + Provider + Sqflite:聚合数据状态管理
- python - Python Webelement 到 .text selenium