0

不足しているフィルターを含む検索クエリでファセットを使用しようとしていますが、不足しているフィルターで除外されるレコードが考慮されていないようです。

Rails アプリで:

@items = Item.search(per_page: 100, page: params[:page], load: true) do |search|
  search.query do |query|
    query.boolean do |boolean|
      boolean.must { |must| must.string params[:q], default_operator: "AND" }
      boolean.must { |must| must.term :project_id, @project.id }
    end
    query.filtered do
      filter :missing , :field =>  :user_id
    end
  end
  search.facet('tags') do
    terms :tag
  end
end

リクエストを生成します:

curl -X GET 'http://localhost:9200/items/user_story/item?load=true&size=100&pretty' -d '{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "*",
            "default_operator": "AND"
          }
        },
        {
          "term": {
            "project_id": {
              "term": 132
            }
          }
        }
      ]
    },
    "filtered": {
      "filter": {
        "and": [
          {
            "missing": {
              "field": "user_id"
            }
          }
        ]
      }
    }
  },
  "facets": {
    "tags": {
      "terms": {
        "field": "tag",
        "size": 10,
        "all_terms": false
      }
    }
  },
  "size": 100
}'

nilファセットを持っています。

不足しているフィルターを search.filter に移動すると

@items = Item.search(per_page: 100, page: params[:page], load: true) do |search|
  search.query do |query|
    query.boolean do |boolean|
      boolean.must { |must| must.string params[:q], default_operator: "AND" }
      boolean.must { |must| must.term :project_id, @project.id }
    end
  end
  search.filter(:missing, :field => 'user_id' )
  search.facet('tags') do
    terms :tag
  end
end

...リクエストを行います:

curl -X GET 'http://localhost:9200/user_stories/user_story/_search?load=true&size=100&pretty' -d '{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "*",
            "default_operator": "AND"
          }
        },
        {
          "term": {
            "project_id": {
              "term": 132
            }
          }
        }
      ]
    }
  },
  "facets": {
    "tags": {
      "terms": {
        "field": "tag",
        "size": 10,
        "all_terms": false
      }
    }
  },
  "filter": {
    "missing": {
      "field": "user_id"
    }
  },
  "size": 100
}'

ファセットを取得しますが、フィルタリングされたレコードは考慮されません。

欠落しているフィルターも考慮したファセットを取得できるように、クエリを作成する別の方法はありますか?

4

1 に答える 1

1

filter私が正しく理解していれば、トップレベルの要素ではなく、クエリによって制限された結果からファセットが計算されるという問題に直面しています。また、最初のクエリは私には正しくありません。

リクエストを次のように書き直します。

require 'tire'

params = {:q => 'foo'}

s = Tire.search do |search|
  search.query do |search_query|
    search_query.filtered do |f|

      # Queries
      f.query do |q|
        q.string params[:q], default_operator: "AND"
      end

      # Filters
      f.filter :missing , :field => :user_id
      f.filter :term,     :project_id => '123'
    end
  end
  search.facet('tags') do
    terms :tag
  end
end

puts s.to_curl

基本的に、filteredクエリをメインクエリとして使用し、ブールクエリを取り除き、filter最大の効率(欠落および用語)​​を使用します。

もちろん、さらにクエリを実行する必要がある場合は、q.boolean代わりにq.string.

最後に、stringクエリ (つまり、Lucene クエリ文字列クエリ) は通常、「特別な Lucene 構文」全体をユーザーに説明し、エラーが発生しやすいため、通常の検索には最適ではありません。通常、matchクエリははるかに適切な選択です。

于 2013-06-08T15:02:32.440 に答える