1

我正在为我的 Symfony3 项目使用https://github.com/ongr-io/ElasticsearchBundle。这个捆绑包的原因是,我的项目正在使用推进。

到目前为止,一切都很好,运行良好。但现在我想添加搜索单词子串的可能性。例如,有一些名为 Test01、Test02、Test03 的项目......当我尝试搜索 Test 时,我没有得到任何结果。就在我输入像 Test01 这样的整个单词时。

我已经阅读了通配符搜索的可能性,但不同的解决方案说,使用 ngram 或 edge_ngram 将是一个更好的解决方案。

我试图在配置中指定它如下

ongr_elasticsearch:
    analysis:
      filter:
        incremental_filter:
          type: edge_ngram
          min_gram: 3
          max_gram: 10
      analyzer:
        incrementalAnalyzer:
          type: custom
          tokenizer: standard
          filter:
              - lowercase
              - incremental_filter
    managers:
      default:
          index:
            hosts:
                - %elastic_host%:%elastic_port%
            index_name: index
            analysis:
              analyzer:
                  - incrementalAnalyzer
              filter:
                  - incremental_filter
          mappings:
              - AppBundle

但我没有得到想要的结果。任何人都可以帮助我吗?过滤器和分析器有什么区别?我正在使用 MultiMatchQuery,因为我想在不同类型的不同字段中进行搜索:

$multiMatchQuery =
 new MultiMatchQuery(
                [
                    'name^12',
                    'product_name^8',
                    'itemno^18',
                    'number^7',
                    'category^6',
                    'company^4',
                    'motor^3',
                    'chassis^13',
                    'engine^14',
                    'description'
                ],
                $term
            );
            $search->addQuery($multiMatchQuery);

我还尝试定义“not_analyzed”字段。

希望得到您的帮助!

谢谢。

4

2 回答 2

1

好的,我找到了解决方案。这是一篇描述问题的文章(特定于德语)https://www.elastic.co/guide/en/elasticsearch/guide/current/ngrams-compound-words.html

所以分析器需要一个 ngram 过滤器(没有与标记器一起使用)。我也忘了用分析仪指定属性。现在它起作用了。

ongr_elasticsearch:
    analysis:
      analyzer:
        my_ngram_analyzer:
          type: custom
          tokenizer: standard
          filter:
            - lowercase
            - my_ngram_filter
      filter:
        my_ngram_filter:
          type: ngram
          min_gram: 2
          max_gram: 8
    managers:
      default:
          index:
            hosts:
                - %elastic_host%:%elastic_port%
            index_name: index
            analysis:
              analyzer:
                  - my_ngram_analyzer
              filter:
                  - my_ngram_filter
          mappings:
              - AppBundle

并且文档中的属性也需要正确定义(对于所有需要的属性)。

    /**
     * @var string
     *
     * @ES\Property(name="itemno", type="string", options={"analyzer":"my_ngram_analyzer"})
     */
    public $itemno;
于 2016-10-03T08:54:50.470 回答
0

捆绑配置表示弹性搜索映射。在分析部分,您可以定义分析器,您可以在单独的管理器中重用它们。

过滤器和分析器之间的区别在于过滤器用于分析器链中。Analyzer 包含一系列操作,其中过滤器是其中的一部分,与标记器、标记过滤器等相同。这是关于分析器的非常好的文章https://www.elastic.co/blog/found-text-analysis-part-1

为了让搜索按你喜欢的方式工作,我认为你应该使用 ngram 标记器而不是过滤器。https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html

于 2016-09-30T07:02:31.440 回答