3

ElasticSearchとtire.rbを使用して、アイテムのコレクションのインデックスを作成して検索しています。

インデックスの名前フィールドでクエリを実行したい。

アルファロメオという名前のドキュメントがある場合は、次を検索してこのドキュメントを検索します。

  1. 「アルファ」
  2. 「アルファレメオ」(つづりの間違いに注意)

ElasticSearchとtireでは、2つのクエリを別々に設定する方法を知っています。

ワイルドカードで検索する:

Model.tire.search do
  query do
    boolean do
      must { string "#{myquerystring}*", default_field: 'name' }
    end
  end
end

ファジー(レーベンシュタイン距離)で検索:

Model.tire.search do
  query do
    boolean do
      must { text :name, { query: mysquerystring, operator: 'AND', fuzziness: 0.4 } }
    end
  end
end

(またはと)組み合わせる方法は?

私がやりたいのは、ワイルドカードまたはあいまい検索が一致するすべてのドキュメントを見つけることです。2つの別々の検索を実行してそれらを組み合わせようとすることもできますが、それはあまり意味がありません。これを論理的な方法で行うことはできますか?

4

2 に答える 2

3

Davidが提案したように、。でboolクエリを使用できますminimum_number_should_match

しかし、ここにクエリ文字列のワイルドカードについてのいくつかの考えがあります。

あなたの場合、プレフィックスクエリは文字列をクエリするよりも望ましいです:

  • クエリ文字列のワイルドカードは、プレフィックスクエリよりも低速です
  • ユーザーが提供したクエリの最後に手動で追加*しています-プレフィックスクエリを使用することを明確に示しています(これはそのために設計されています)

Tireの場合、完全な例を次に示します。

require 'tire'


class Car
  include Tire::Model::Persistence

  property :name, type: "multi_field",
                    fields: {
                      name:  { type: 'string', analyzer: 'snowball'  },
                      exact: { type: 'string', index:    'not_analyzed' }
                    }

end

Car.index.delete
Car.create_elasticsearch_index

Car.create name: 'Alfa'
Car.create name: 'Alfa Romeo'
Car.index.refresh

queries = [ 'Alfa', 'Alf', 'Alfa Remeo', 'Remeo' ] # Notice the spelling mistake

puts "Searching for: #{queries.join(', ')}", "="*80, ""

queries.each do |q|

  s = Car.search do
    query do
      boolean minimum_number_should_match: 1 do
        should { prefix 'name', q  }
        should { prefix 'name.exact', q, boost: 10 }
        should { match :name, q, operator: 'AND', fuzziness: 0.4 }
      end
    end
  end

  puts "Found #{s.results.size} results for query '#{q}':",
      "-"*80,
       s.map { |d| "#{d.name} (score: #{d._score})" }.join(", "),
       ""
end

結果:

Searching for: Alfa, Alf, Alfa Remeo, Remeo
================================================================================

Found 2 results for query 'Alfa':
--------------------------------------------------------------------------------
Alfa (score: 0.67262733), Alfa Romeo (score: 0.67027444)

Found 2 results for query 'Alf':
--------------------------------------------------------------------------------
Alfa (score: 0.6693944), Alfa Romeo (score: 0.66834825)

Found 1 results for query 'Alfa Remeo':
--------------------------------------------------------------------------------
Alfa Romeo (score: 0.08865173)

Found 1 results for query 'Remeo':
--------------------------------------------------------------------------------
Alfa Romeo (score: 0.06392767)
于 2012-09-24T20:11:48.127 に答える
2

shouldクエリでブールクエリを使用するのはどうですか:http ://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html ?

それはあなたのユースケースに答えますか?

デビッド

于 2012-09-20T23:14:23.260 に答える