0

Elasticsearch 2 を Rails 4 で使用する、elasticsearch-model gem を使用する

すべて問題なく、ジオポイントの距離も機能しています。ただし、単純なブール値フィルターを機能させる方法を一生解決することはできません。単純なブール値「exclude_from_search_results」があり、(true の場合) レコードが結果から除外されます。

Railsコントローラーでの私のクエリは次のとおりです(フィルターなし):

    @response = Firm.search(
    query: {
      bool: {
        should: [
          { multi_match: {
              query: params[:search],
              fields: ['name^10', 'address_1', 'address_2', 'address_3', 'address_4', 'address_5', 'address_6'],
              operator: 'or'
            }
          }
        ]
      }
    },
    aggs: {types: {terms: {field: 'firm_type'}}}
  )

これをboolまたはqueryセクション内、またはその外の両方に追加しましたが、ドキュメントを取得しないか、すべてのドキュメントを取得します。(9000 が一致する必要があります)

例:

  @response = Firm.search(
    query: {
      bool: {
        should: [
          { multi_match: {
              query: params[:search],
              fields: ['name^10', 'address_1', 'address_2', 'address_3', 'address_4', 'address_5', 'address_6'],
              operator: 'or'
            }
          }
        ],
            filter: {
            term: {"exclude_from_search_results": "false"}
        }
      }
    },
    aggs: {types: {terms: {field: 'firm_type'}}}
  )

また、フィルター句をさまざまな場所に配置しようとしましたが、エラーが発生するか、結果が得られません。私は何を間違っていますか?? おそらく単純なものが欠けています...

これが私のマッピングです:

    "mappings" : {
  "firm" : {
    "dynamic" : "false",
    "properties" : {
      "address_1" : {
        "type" : "string",
        "index_options" : "offsets",
        "analyzer" : "english"
      },
      "address_2" : {
        "type" : "string",
        "index_options" : "offsets",
        "analyzer" : "english"
      },
      "address_3" : {
        "type" : "string",
        "index_options" : "offsets",
        "analyzer" : "english"
      },
      "address_4" : {
        "type" : "string",
        "index_options" : "offsets",
        "analyzer" : "english"
      },
      "address_5" : {
        "type" : "string",
        "index_options" : "offsets",
        "analyzer" : "english"
      },
      "address_6" : {
        "type" : "string",
        "index_options" : "offsets",
        "analyzer" : "english"
      },
      "exlude_from_search_results" : {
        "type" : "boolean"
      },
      "firm_type" : {
        "type" : "string",
        "index" : "not_analyzed"
      },
      "location" : {
        "type" : "geo_point"
      },
      "name" : {
        "type" : "string",
        "index_options" : "offsets",
        "analyzer" : "english"
      }

どんなポインタでも大歓迎です...

4

1 に答える 1

1

現在のクエリは、フィルターと複数一致クエリの間で OR を実行しています。それが、すべてのドキュメントを取得する理由です。

フィルターと複数一致クエリの間で AND を実行したいと思います。この場合、次のクエリが機能します。

{
    "query": {
        "bool": {
            "must": [
                {
                    "multi_match": {
                        "query": "address1",
                        "fields": [
                            "name^10",
                            "address1",
                            "address2",
                            "address3",
                            "address4",
                            "address5",
                            "address6"
                        ],
                        "operator": "or"
                    }
                },
                {
                  "term": {
                    "exclude_from_search_results": {
                      "value": "false"
                    }
                  }
                }
            ]
        }
    },
    "aggs": {
        "types": {
            "terms": {
                "field": "name"
            }
        }
    }
}

この助けを願っています、ありがとう。

于 2017-01-01T07:17:10.190 に答える