【问题标题】:FOSElasticaBundle / elasticsearch configuration for partial word matchingFOSElasticaBundle / elasticsearch 配置部分词匹配
【发布时间】:2013-08-08 10:38:12
【问题描述】:

我是搜索/索引方面的新手,我正在使用 Symfony 的 FosElasticaBundle 为 Web 应用程序提供搜索功能。在我发现默认设置只允许全词搜索之前,我已经设置并运行它没有问题。

然后我尝试了几个小时来启用部分单词匹配,但没有运气。我尝试了 nGram 和 edgenGram 等,但我真的对所有概念感到困惑。我确实尝试搜索有关概念和配置的教程,但并没有真正得到答案。

这是我的配置:

fos_elastica:
  clients:
      default: { host: localhost, port: 9200 }
  serializer:
      callback_class: FOS\ElasticaBundle\Serializer\Callback
      serializer: serializer
  indexes:
      website:
          client: default
          finder: ~
          settings:
              index:
                  analysis:
                      analyzer:
                          index_analyzer:
                              tokenizer: "nGram"
                              filter:  ["lowercase", "snowball"]
                          search_analyzer:
                              tokenizer: "nGram"
                              filter:  ["lowercase", "snowball"]

                      filter:
                          snowball:
                              type: "snowball"
                              language: "English"
          types:
              client:

                  mappings:
                      BusinessName: { boost: 10 }
                      users:
                          type: "object"
                          properties:
                              firstName: { boost: 5 }
                              lastName: { boost: 5 }
                              email: { boost: 10 }
                  persistence:
                      driver: orm # orm, mongodb, propel are available
                      model: E1\Bundle\CoreBundle\Entity\Client
                      listener:
                      provider: ~
                      finder: ~

文档没有帮助。谁能告诉我如何获得部分单词匹配集和/或让我知道在哪里可以找到有关概念(标记器、过滤器、分析器)的教程?

【问题讨论】:

    标签: php search indexing elasticsearch


    【解决方案1】:

    如果您使用默认搜索:$resultSet = $userType->search('bob');,您将拥有非常有限的 ElasticSearch 功能。

    默认代码执行Query::create($query);,从而创建QueryString 查询。

    QueryString 很棒,因为你可以写通配符,它​​默认搜索 _all 字段,所以如果你想让 Po 匹配包含 Pony 的文档,你必须使用$userType->search('Po*');

    这里不需要自定义分析器。标准的已经使用空格分隔单词并将所有内容小写。

    关于文档和帮助,请记住 Elastica 是一个工具,这里真正的搜索引擎是 ElasticSearch,所以我能给你的最好建议是用 Json 编写和原型化你的查询。你可以使用 Head 插件,或者这个Chrome Extension

    【讨论】:

    • 但是使用 ('Po*') 将获取所有包含 'Po' 或 'po' 的文档,无论它们放在哪里 - 在开头、中间或结尾。有没有办法限制搜索,只找到以“po”开头的元素?
    猜你喜欢
    • 2016-10-10
    • 2018-03-17
    • 2018-11-01
    • 2020-02-02
    • 2013-09-11
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多