3

可能重复:如何使用前缀通配符,如“* abc”和匹配项

但我找不到我的答案,所以问了这个问题,抱歉重复了。

我在 MySQL 中执行查询

记录是:

  1. 我是约翰·多伊。
  2. 约翰·多伊是个男人。
  3. 约翰姓氏是母鹿

%john d%将匹配前两个结果,因为它们的顺序相同,而 wilds 将匹配记录中的任何位置但是在大型数据集中,这已经杀死了性能

所以我用谷歌搜索并发现MATCH AGAINST IN BOOLEAN MODE 作为替代方案。现在,我的搜索词是:john d 它试过了

AGAINST('"john d"')
AGAINST('john d*')
AGAINST('+john +d') etc

我只想得到相同顺序的结果。(例如 1. 我是 john doe。2. john doe 是男人)对于这个搜索词 john d 但我无法实现。 就像 %john d%给了我想要的,但它会扼杀性能。我怎样才能在 MySQL 中以快速的性能获得我想要的结果。

在可能重复:如何使用前缀通配符,如 '*abc' 与 match-against

@GolezTrol提供了一个解决方案来创建一个单独的列,他在其中反转字符串:

user_login user_login_rev
xyzabc     cbazyx

然后,我们可以查找 'john d%' 而不是查找'%john d',如果该列被索引,这会更快。

@PeerBr请注意,如果您想从字符串中间查找内容,则反转字符串对您没有帮助。通过使用普通索引键入“Blue%”或使用倒置 inices反转“Blue%” ,您不会找到“Jimmy Blue Jones” 。

谢谢

4

1 回答 1

1

对于 Solr,这应该与带有 KeywordTokenizer 和 ReverseWildcardFilter的字段很好地配合使用:

<fieldType name="c_string" class="solr.TextField">
 <analyzer type="index">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
  <filter class="solr.ReversedWildcardFilterFactory" />
 </analyzer>
 <analyzer type="query">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
  <filter class="solr.ReversedWildcardFilterFactory" />
 </analyzer>
</fieldType>

根据您的用例,您可以删除 ASCIIFoldingFilterFactory。LowerCaseFilterFactory 确保字符串正确小写,而 KeywordTokenizer 将整个字符串保留为单个标记 - 这样您就不会在示例中匹配大小写 #3。

ReversedWildcardFilter 也以相反的顺序存储令牌,当它检测到前缀通配符时,它也会附加一个反向令牌前缀搜索,因此您仍然可以从索引令牌中获得良好的性能。

于 2016-12-12T10:49:36.003 回答