Solr:在关键字中搜索 with/without 个空格
Solr: Searching with/without spaces in keywords
我在将 space 引入关键字时遇到问题,例如:
我们有一款产品名为“Sony Playstation 4 Camera V2 PS4
(PSVR)"
搜索“playstation”或“playstation camera”会返回此产品
搜索“play station”或“play station camera”无法返回此产品(注意
space)
这是正在使用的字段类型:
<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,但它可能发生在任何搜索词上,例如“赛博朋克”、“赛博朋克”。因此,需要大量手动工作的解决方案(例如为 play station => playstation
添加同义词)是不可行的。
我尝试过但没有成功的事情:
- N-GRAM 过滤器和分词器
- 模糊搜索
- 去除白色space
- 逃白space
您可以使用 Shingle Filter 将多个标记合并为一个。
<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
作为单个标记(在本例中)。如果您的条款中人们可能会多次拆分一个词,那可能是必要的。
如果您假设您的术语已正确编入索引,并且这仅在查询时需要,则您的索引将不会更改并且您不必重新编制索引(并且大小不会更改)。
您可能需要更改周围过滤器的位置;你的词干过滤器会在神秘的地方打破这个,因为你最终会连接以前的词干。
我在将 space 引入关键字时遇到问题,例如:
我们有一款产品名为“Sony Playstation 4 Camera V2 PS4 (PSVR)"
搜索“playstation”或“playstation camera”会返回此产品
搜索“play station”或“play station camera”无法返回此产品(注意 space)
这是正在使用的字段类型:
<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,但它可能发生在任何搜索词上,例如“赛博朋克”、“赛博朋克”。因此,需要大量手动工作的解决方案(例如为 play station => playstation
添加同义词)是不可行的。
我尝试过但没有成功的事情:
- N-GRAM 过滤器和分词器
- 模糊搜索
- 去除白色space
- 逃白space
您可以使用 Shingle Filter 将多个标记合并为一个。
<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
作为单个标记(在本例中)。如果您的条款中人们可能会多次拆分一个词,那可能是必要的。
如果您假设您的术语已正确编入索引,并且这仅在查询时需要,则您的索引将不会更改并且您不必重新编制索引(并且大小不会更改)。
您可能需要更改周围过滤器的位置;你的词干过滤器会在神秘的地方打破这个,因为你最终会连接以前的词干。