如何使用使用Solr等的MySQL中的Match-Against获得与%someword%相同的效果



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

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

我正在MySQL中执行查询

记录是:

  1. 我是约翰·杜(John Doe)。
  2. 约翰·杜(John Doe)是一个男人。
  3. 约翰姓氏是doe

喜欢%John D%将与第一个结果相匹配,因为它们是相同的顺序,Wilds将与记录中的任何地方匹配但是在大数据集中,这杀死了性能

所以我搜索并找到了在布尔模式下与与作为替代方案。现在我的搜索词是:约翰·D它尝试了

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

我只想获得以相同顺序的结果。(例如1.我是约翰·杜(John Doe)。2。约翰·杜(John Doe)是一个男人)在这个搜索词约翰·D(John D)中,但我无法实现。喜欢%John D%给出了我的期望,但它杀死了表现。我如何以快速的性能在MySQL中获得所需的结果。

可能的重复:如何将前缀通配符与"*abc"(例如abc'against

)在
user_login user_login_rev
xyzabc     cbazyx

然后,我们可以寻找'John D%'而不是寻找'%John D',如果索引列,这要快得多。

但是

@peerbr 如果您想从字符串的中间找到东西,反转字符串将无济于事。您找不到" Jimmy Blue Jones" 通过使用普通索引或倒置'blue%'键入'blue%'

谢谢

对于solr,这应该与具有关键WordTokenizer和ReverseWildCardCardFilter的字段很好地工作:

<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可确保字符串正确,而关键WordingTokenizer将整个字符串作为一个令牌保持 - 因此您在示例中不匹配案例#3。

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

/html>

相关内容

  • 没有找到相关文章

最新更新