可能的重复:如何使用'*abc'之类的前缀通配符与匹配against
,但我找不到答案,所以问这个问题,对不起。
我正在MySQL中执行查询
记录是:
- 我是约翰·杜(John Doe)。
- 约翰·杜(John Doe)是一个男人。
- 约翰姓氏是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也以相反的顺序存储令牌,当它检测到前缀通配符时,它也附加了反向的令牌前缀搜索,因此您仍然可以从索引的令牌中获得良好的性能。