【问题标题】:How to get same effect as like %someword% with match-against in MySQL with using solr etc如何使用 solr 等在 MySQL 中通过 match-against 获得与 %someword% 相同的效果
【发布时间】:2017-04-27 00:46:53
【问题描述】:

可能重复:How to use prefix wildcards like '*abc' with match-against

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

我正在 MySQL 中执行查询

记录是:

  1. 我是 john doe。
  2. John doe 是个男人。
  3. 约翰姓氏是母鹿

like %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 但我无法实现。 like %john d% 给了我想要的,但它扼杀了性能。 我怎样才能在 MySQL 中以快速的性能获得我想要的结果。

可能重复:How to use prefix wildcards like '*abc' with match-against

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

user_login user_login_rev
xyzabc     cbazyx

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

但是

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

谢谢

【问题讨论】:

    标签: php mysql solr sql-like match-against


    【解决方案1】:

    对于 Solr,这应该与字段 with a KeywordTokenizer and a 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 也以相反的顺序存储令牌,当它检测到前缀通配符时,它也会附加一个反向令牌前缀搜索,因此您仍然可以从索引令牌中获得良好的性能。

    【讨论】:

    • 任何没有 solr 的建议
    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2012-05-22
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多