0

私はelasticsearchを試していますが、見栄えがします!

hello worldしかし、検索するとhello wo結果が返されないというフィールドに、非常に不快な問題があることに気付きました。

なぜこれが起こるのですか?

構成 (FOSElasticaBundle) を配置します。

fos_elastica:
clients:
    default: { host: localhost, port: 9200 }
serializer:
    callback_class: FOS\ElasticaBundle\Serializer\Callback
    serializer: serializer
indexes:
    website:
        client: default
        settings:
            index:
                analysis:
                    analyzer:
                        custom_search_analyzer:
                            type: custom
                            tokenizer: standard
                            filter   : [standard, worddelimiter, stopwords, snowball, lowercase, asciifolding]
                        custom_index_analyzer:
                            type: custom
                            tokenizer: nGram
                            filter   : [standard, worddelimiter, stopwords, snowball, lowercase, asciifolding]
                    filter:
                        stopwords:
                            type:      stop
                            stopwords: [_italian_]
                            ignore_case : true
                        worddelimiter :
                            type:       word_delimiter
                    tokenizer:
                        nGram:
                          type:     nGram
                          min_gram: 1
                          max_gram: 20
        types:
            structure:
                mappings:
                    name: { boost: 9, search_analyzer: custom_search_analyzer, index_analyzer: custom_index_analyzer, type: string }

解決方法について何か考えはありますか?

編集 ここで私のクエリ:

{
  query: {
    bool: {
        must: [ ]
        must_not: [ ]
        should: [
            {
                term: {
                    structure.name: hello wo
                }
            }
        ]
    }
}
  from: 0
  size: 10
  sort: [ ]
  facets: { }
}

編集2

わかりました、私はこの行動を理解していません...

今、私はこのクエリを実行します:

{
    query: {
        bool: {
            must: [
            {
                term: {
                    structure.name: hello
                }
            }
            {
                term: {
                    structure.name: wo
                }
            }
            ]
            must_not: [ ]
            should: [ ]
        }
    }
    from: 0
    size: 10
    sort: [ ]
    facets: { }
}

このクエリは私が望んでいた結果ですが、must with two words と two must have a word の違いは何なのかわかりません。

この振る舞いを説明できますか?

4

1 に答える 1

4

さて、おそらくそれがどのように機能するかを説明する必要があります

テキストにインデックスを付けると、エラスティック検索は、テキストが分析されている場合(マッピングにあるように)、それを用語に分割しようとします。そのため、用語を実行すると、「hello world」は「hello」と「world」の2つの用語に嫌われます。あなたの2つの用語のいずれにも適合しない用語hello worldを書いて検索してください。

フィールド名が分析されないマッピングで設定できる用語への吐き出しを避けるために、2 つの単語に吐き出されず、1 つのトークンとして処理されます。

他の解決策は、マルチタームクエリができることです

{
  "query": {
    "terms": {
      "structure.name": [
        "world",
        "hello"
      ]
    }
  }
}

また、 query_string を使用すると、アルゴリズムが異なるため、結果が返されます。

したがって、必要に応じてさまざまなクエリを使用する必要がありますが、名前で検索するには query_string を使用する必要があります。フィルターを適用する場合は、categoryId、タグなどを使用する必要があります。

于 2014-01-31T10:02:28.200 に答える