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

バンドル構成は、elasticsearch マッピングを表します。分析セクションでは、別のマネージャーで再利用できるアナライザーを定義できます。

フィルターとアナライザーの違いは、フィルターがアナライザー チェーンで使用されることです。アナライザーには、トークナイザー、トークン フィルターなどと同じように、フィルターがその一部である一連のアクションが含まれています。これはアナライザーに関する非常に優れた記事です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 に答える