2

ElasticSearchで部分一致をレンダリングする前に、正確な文字列一致を注文しています

3 つのドキュメントがあるとします。

  • マイケル・A
  • マイケル・B
  • ミカ

michaを検索すると、3 番目のドキュメントのみが返されます。ただし、 micha*を検索すると、上記の順序で 3 つのドキュメントすべてが取得されます。

私の質問は、他の結果の前に表示される 3 番目のドキュメント (完全一致) を取得するにはどうすればよいですか?

  :analysis => {
      :filter => {
        "my_edge_ngram_filter" => {
          "type"     => "edgeNGram",
          "min_gram" => 1,
          "max_gram" => 128,
          "side" => "front",
        },
        "my_phone_filter" => {
          "type"    => "pattern_replace",
          "pattern" => "\\D",
          "replacement" => ""
        }
      },
      :analyzer => {
        "default_index" => {
          "tokenizer" => "uax_url_email",
          "filter" => [
            "standard",
            "lowercase",
            "stop",
            "my_edge_ngram_filter"
          ],
          "type"   => "custom"
        },
        "my_phone_analyzer" => {
          "tokenizer" => "keyword",
          "filter" => [
            "my_phone_filter",
          ],
          "type"   => "custom"
        },
        "default_search" => {
          "type"   => "standard"
        }
      }
    }
  }
4

1 に答える 1

3

multi_field + ブースティングを使用できます。

  • 1つは単語による検索でマッピングし、2番目のフィールドよりも高いスコアでブーストします
  • 2 つ目は、ngram アナライザーを使用したマッピングです。
"name" : {
      "type" : "multi_field",
      "fields" : {
          "name" : {
              "type" : "string",
              "index" : "analyzed",
              "index_analyzer" : "standard",
              "search_analyzer" : "standard",
              "boost" : 10.0
          },
          "partial": {
              "type" : "string",
              "index" : "analyzed",
              "index_analyzer" : "your_ngram_analyzer",
              "search_analyzer" : "standard",
              "boost" : 1.0
          }
  }
   }

次に、両方のフィールドで検索を行います。例:

"query": {
    "query_string": {
      "query": "micha",
      "fields": [
        "name.partial",
        "name"
      ],
      "default_operator": "and"
    }
  }

PS: クエリ内でフィールド ブースティングを動的に指定することもできます。

"query": {
    "query_string": {
      "query": "micha",
      "fields": [
        "name.partial^1",
        "name^10"
      ],
      "default_operator": "and"
    }
  }
于 2013-09-21T16:08:59.713 に答える