【问题标题】:How to find "FooBar" when seaching "Foo Bar" in Zend Lucene在 Zend Lucene 中搜索“Foo Bar”时如何找到“FooBar”
【发布时间】:2009-04-29 07:09:52
【问题描述】:

我正在使用 Zend Lucene 为 php 网站构建搜索功能,但遇到了问题。 我的网站是店长(类似的东西)。

例如,我有一家名为“FooBar”的商店,但我的访客搜索“Foo Bar”并获得零结果。此外,如果一家商店被命名为“Foo Bar”并且访客搜索“FooBar”,则什么也找不到。

我试图搜索“foobar~”(模糊搜索)但没有找到名为“Foo Bar”的文章

是否有一种特殊的方式来构建索引或进行查询?

【问题讨论】:

    标签: php zend-framework lucene zend-search-lucene fuzzy-search


    【解决方案1】:

    选项 1:在不同点将输入查询字符串分成两部分并搜索它们。例如。在这种情况下,查询将是 (+fo +bar) OR (+foo +bar) OR (+foob +ar) 问题是这种标记化假设输入查询字符串中有两个标记。此外,您可能会得到额外的、可能不相关的结果,例如 (+foob +ar) 的结果

    选项 2:在索引和查询时使用 n-gram 标记化。虽然索引“foo bar”的标记将是 fo、oo、ba、ar。使用 foobar 搜索时,标记将是 fo、oo、ob、ba、ar。使用 OR 作为运算符搜索将在顶部为您提供具有最大 n-gram 匹配的文档。这可以通过NGramTokenizer 实现

    【讨论】:

    • 操作。 2 听起来不错,知道如何使用 n-gram 标记化吗?谢谢
    【解决方案2】:

    为最常见的名称混淆手动添加索引条目。让您的客户在特殊表格上输入。

    【讨论】:

      【解决方案3】:

      你试过“*foo* AND *bar*”还是“*foo* OR *bar*”?它在 Ferret 中工作,我读到它是基于 Lucene 的。

      【讨论】:

      • 如果查询是 FOO BAR 并且在数据库中我有 FOOBAR 但如果您正在搜索 FOOBAR 并且在数据库中您有 FOO BAR,则它不起作用
      • 对,我的错...我有一个疯狂的想法:尝试在每个字符之间放置“”“foob ar" 并设置一些字符串长度限制(如果 str_len > 5)。或者您可以尝试在大写字母和大写字母之间放置空格 - 然后将“FooBar”分隔为“Foo Bar” - 但用户需要将此字符串放在驼峰式大小写中。
      【解决方案4】:

      如果您不关心性能,请使用 WildcardQuery(性能明显更差):

      new WildcardQuery( new Term( "propertyName", "Foo?Bar" ) );
      

      对于零个或多个字符,使用'*',对于零个或一个字符,使用'?'

      如果性能很重要,请尝试使用 BooleanQuery。

      【讨论】:

      • 如果用户搜索“foobar”并且在数据库中我有“foo bar”,则脚本无法知道将其放在哪里“?”或“*”
      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 2017-07-25
      • 2011-12-09
      • 1970-01-01
      • 2012-02-26
      • 2022-11-04
      • 1970-01-01
      • 2019-08-30
      相关资源
      最近更新 更多