代码之家  ›  专栏  ›  技术社区  ›  Christian

PHP字索引、性能及合理结果

  •  3
  • Christian  · 技术社区  · 15 年前

    我目前正在为搜索功能开发索引器。索引器将处理来自“字段”的数据。 字段如下:

      Field_id   Field_type   Field_name   Field_Data
    - 101        text         Name         Intel i7
    - 102        integer      Cores        4 physical, 4 virtual
    - 103        select       Vendor       Intel
    - 104        multitext    Description  The i7 is intel's next gen range of cpus.
    

    索引器将生成以下结果/索引:

      Keyword    Occurrences
    - intel      101, 103, 104
    - i7         101, 104
    - physical   102
    - virtual    102
    - next       104
    - gen        104
    - range      104
    - cpus       104   (*)
    - cpu        104   (*)
    

    所以看起来一切都很好很好,但是,我想解决一些问题:

    • 过滤掉常用词(正如您可能注意到的那样,“is”和“intel”在列表中丢失)
    • 关于“CPU”(复数与单数),最好使用特定类型(单数或复数),两者都使用还是精确(即,“CPU”不同“CPU”)?
    • 继续上一项,如何确定复数(不同口味:test=>tests fish=>fish and leaf=>leaves)
    • 我目前正在使用MySQL 非常关心 由于性能问题,我们有500多个类别,甚至没有启动该站点
    • 假设我想使用搜索术语“vendor:intel”,其中vendor指定字段名(field_name),您认为这会对SQL Server产生巨大影响吗?
    • 搜索节流;我一点也不喜欢这样,但这是一种可能性,如果你知道任何解决办法,请告诉你自己!
    • 还有一些我可能忘记的问题,如果你发现了,欢迎你对我大喊大叫;-)
    • 我不需要搜索引擎来爬行链接,事实上,我 特别希望它不爬行链接 .

    (顺便说一下,我对英特尔没有偏见,只是我拥有一台基于i7的PC;-)

    7 回复  |  直到 13 年前
        1
  •  1
  •   Community CDub    8 年前

    这是对你最初的问题的回应,你后来的问题 answer/question .

    我已经用过了 Sphinx 搜索引擎之前(很久以前,我有点生疏),发现它非常好,即使文档有时有点缺乏。

    我敢肯定还有其他方法可以做到这一点,无论是用你自己的自定义代码,还是用其他搜索引擎,斯芬克斯恰好是我用过的。我不是说它可以做任何你想做的事情,就像你想做的那样,但是我可以合理地确定它可以很容易地完成大部分工作,而且比任何单独用php/mysql编写的东西都快得多。

    我推荐阅读 Build a custom search engine with PHP 在挖掘之前 Sphinx documentation . 如果你读了那篇文章后觉得不合适,那就公平了。

    为了回答您的具体问题,我整理了文档中的一些链接,以及一些相关的引用:

    过滤掉常用词(正如您可能注意到的那样,“is”和“intel”在列表中丢失)

    11.2.8. stopwords

    停止词是不会 被索引。通常你会把 非索引字词列表中的常用词 因为它们不会给 搜索结果,但消耗了大量 要处理的资源。

    关于“CPU”(复数与单数),最好使用特定类型(单数或复数),两者都使用还是精确(即,“CPU”是不同的“CPU”)?

    11.2.9. wordforms

    单词形式在后面应用 通过标记输入文本 字符集表格规则。它们本质上 让你用一个词替换另一个词。 通常情况下,它会用来 不同的单词形式 正常形式 变量,如“walks”、“walked”, “行走”到正常形态“行走”)。 它也可用于实现 词干异常,因为词干 不适用于在 表单列表。

    继续上一项,如何确定复数(不同口味:test=>tests fish=>fish and leaf=>leaves)

    斯芬克斯支持 Porter Stemming Algorithm

    波特词干算法(或 __porter stemmer_)是用于 去除普通形态 和词尾的屈折 英语。它的主要用途是作为 术语归一化过程,即 通常在设置时完成 信息检索系统。

    假设我想使用搜索术语“vendor:intel”,其中vendor指定字段名(field_name),您认为这会对SQL Server产生巨大影响吗?

    3.2. Attributes

    属性的一个好例子是 论坛发帖台。假设只有 标题和内容字段必须是 全文搜索-但是 有时也需要限制 搜索某个作者或 子论坛(即只搜索那些行 有一些特定的价值 作者ID或论坛ID列 SQL表);或按匹配项排序 发布日期列;或与组匹配 按发布日期的月份发布,以及 计算每组匹配计数。

    这可以通过指定 所提及的列(不包括标题 内容,即全文 字段)作为属性,索引它们, 然后使用API调用安装 过滤、排序和分组。

    您也可以使用 5.3. Extended query syntax 要搜索特定字段(而不是按属性筛选结果):

    字段搜索运算符: @供应商英特尔

    搜索引擎如何索引一组字段并将找到的短语/关键字等与特定字段ID绑定?

    8.6.1. Query

    成功后,query()返回一个结果集,该结果集包含一些找到的匹配项(如setlimits()所请求的)和其他每个查询的常规统计信息。>结果集是一个哈希(特定于PHP;其他语言可能使用其他结构而不是哈希),具有以下键和值:

    “火柴”:
    将找到的文档ID映射到另一个包含文档权重和属性值的小哈希(如果启用了setarraryresult(),则为类似的小哈希数组)。

    “合计”:
    此查询在服务器上检索到的匹配项总数(即到服务器端结果集)。您最多可以从服务器检索具有当前查询设置的此查询文本的匹配项。

    “总计发现”:
    索引中匹配文档的总数(在服务器上找到并处理)。

    “词”:
    将查询关键字(大小写折叠、词干化和其他处理方式)映射到具有每个关键字统计信息的小哈希(“docs”、“hits”)。

    “错误”:
    searchd报告的查询错误消息(字符串,可读)。如果没有错误,则为空。

    “警告”:
    searchd报告的查询警告消息(字符串,可读)。如果没有警告,则清空。

    也看到 Listing 11 Listing 13 用PHP构建自定义搜索引擎 .

        2
  •  3
  •   Benbob    15 年前

    从这里抓取一个停止词列表(非关键字),这个家伙甚至已经为你用PHP格式化了它们。 http://armandbrahaj.blog.al/2009/04/14/list-of-english-stop-words/

    然后简单地对正在索引的字符串执行preg_替换。

    我过去所做的是用regex删除后缀,如's'、'ed'等,并在搜索字符串中使用相同的regex。但这并不理想。这是一个只有200页的基本网站。

    如果您关心性能,您可能会考虑使用像Lucine(Solr)这样的搜索引擎而不是数据库。这将使索引更加容易。你不想在这里重新发明轮子。

        3
  •  1
  •   NullUserException Mark Roddy    15 年前

    过滤掉常用词(如你 可能注意到,“是”和 列表中缺少“Intel”)。

    查找(或创建)常用词列表并筛选用户输入。

    关于“CPU”(复数与 是不是最好用 特殊类型(单数或复数) 两者或完全不同(即“CPU”不同 “CPU”?

    视情况而定。如果这不是一个很大的负担,我会寻找两者;如果可能的话,我会寻找使用相似子句的单数形式。

    继续上一项,如何 我决定一个复数(不同 口味:test=>tests fish=>鱼和 叶=>叶)

    创建一个inflector方法或类。IE: Inflect::plural('fish') 给你 'fish' . 可能会有这样的英语课,查一下。

    我目前正在使用MySQL,我非常 关注绩效问题;我们 有500多个类别,但我们没有 甚至启动网站

    有好的模式和代码设计是有帮助的,但是我不能给你很多关于这个的建议。

    假设我想用搜索 术语“供应商:英特尔”,其中供应商 指定字段名(字段名), 你认为会有一个巨大的 对SQL Server的影响?

    这真的很有帮助,因为您将查找单个列而不是多个列。只需小心过滤用户输入和/或只允许查找特定的列。

    搜索限制;我不喜欢这个 但这是可能的,如果 你知道有什么解决办法吗? 你自己听到了!

    这里的选择不多。为了帮助提高性能,您应该考虑使用某种缓存。

        4
  •  1
  •   Andrew McCombe    13 年前

    我衷心建议你看看索尔。它是一个基于Java的独立搜索和索引系统,可能比PHP解决方案有更多的好处。

        5
  •  0
  •   Homer6    15 年前

    搜索很难实现。如果你是新手,建议你使用一个软件包。

    你考虑过吗 http://framework.zend.com/manual/en/zend.search.lucene.html ?

        6
  •  0
  •   Christian    15 年前

    由于许多人建议使用现有的包(我想让您更难接受,而不仅仅是建议一个包;-),我们假设我将使用这样的包(在这个答案线程中)。

    搜索引擎如何索引一组字段并将找到的短语/关键字等与特定字段ID绑定? 这不是我想要回答的问题,至少不是直接回答。我的问题是,让搜索引擎按我想要的方式工作有多容易? 考虑到我的上述要求,这是否可能/可行?

    从个人经验来看,我宁愿浪费一些时间来调整我的系统,而不是修改别人的代码,我必须浪费更多的时间来先理解别人的代码。 称我为保守派,但我很少坚持别人的代码/程序,当我这样做的时候,那是因为一个绝望的情况-而且我通常会以某种方式为这个项目做出贡献。

        7
  •  0
  •   Mark Baker    15 年前

    有一个关于语音标记器brill部分的PHP实现 php/ir . 这可能提供了一个框架来识别那些应该丢弃的单词和那些您想要索引的单词,同时它还标识复数(和根单数)。它并不完美,尽管它是一个处理技术术语的自定义词典,但它可能对解决前三个问题很有用。

    推荐文章