繁体   English   中英

如何在MySQL中使用solr等获得与%someword%相同的效果

[英]How to get same effect as like %someword% with match-against in MySQL with using solr etc

可能重复: 如何使用匹配的'* abc'前缀通配符

但是我找不到我的答案,所以问了这个问题对不起。

我在MySQL中执行查询

记录是:

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

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

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

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

我只想获得相同顺序的结果。 (例如,我是约翰·多恩。约翰·多伊是一个男人)对于这个搜索词john d但我无法实现它。 像%john d%给了我的期望,但它杀死了性能。 如何以快速的性能在MySQL中获得我想要的结果。

可能重复: 如何使用匹配的'* abc'前缀通配符

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

user_login user_login_rev
xyzabc     cbazyx

然后,我们可以寻找'john d%'而不是寻找'%john d' ,如果列被索引,它会快得多。

@PeerBr请注意,如果你想从字符串的中间找到东西,反转字符串将无法帮助你。 您不会使用正常索引键入“Blue%”,也不会使用反转的内容反转“Blue%”来找到“Jimmy Blue Jones”

谢谢

对于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也以相反的顺序存储令牌,当它检测到前缀通配符时,它还会附加反向令牌前缀搜索,因此您仍然可以从索引令牌中获得良好的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM