gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:39:26 26 4
gpt4 key购买 nike

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

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

我正在 MySQL 中执行查询

记录是:

  1. 我是小李。
  2. John doe 是个男人。
  3. John 姓 doe

like %john d% 将匹配前两个结果,因为它们的顺序相同,并且 Wilds 将匹配记录中的任何位置但在大型数据集中,这会降低性能

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

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

我只想获得顺序相同的结果。(例如 1. i am john doe。2. john doe is a man)对于这个搜索词 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%' 或使用反转索引反转 'Blue%' 来找到 "Jimmy Blue Jones" .

谢谢

最佳答案

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

关于php - 如何使用 solr 等在 MySQL 中使用 match-against 获得与 %someword% 相同的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41096001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com