web-dev-qa-db-ja.com

Elasticsearchでの検索と同様

Jsonファイルからのフィルタリングと検索にelasticsearchを使用しており、このテクノロジーの初心者です。そのため、elasticsearchでクエリのように書く方法が少し混乱しています。

select * from table_name where 'field_name' like 'a%'

これはmysqlクエリです。 Elasticsearchでこのクエリを作成するにはどうすればよいですか? elasticsearchバージョン0.90.7を使用しています。

17
Dixit Sourav

可能な場合はElasticSearchバージョンを更新することを強くお勧めします。0.9.x以降に大幅な変更が加えられています。

ElasticSearchがこの機能を実行する方法はたくさんあり、全体的な目標が少し異なるため、この質問は十分具体的ではありません。そのSQLクエリを正確に複製する場合は、この場合、ワイルドカードクエリまたはプレフィックスクエリを使用します。

wildcard クエリを使用:

注:ワイルドカード検索には注意が必要です。ワイルドカード検索は低速です。文字列の先頭にワイルドカードを使用しないでください。

GET /my_index/table_name/_search
{
    "query": {
        "wildcard": {
            "field_name": "a*"
        }
    }
}

または プレフィックスクエリ

GET /my_index/table_name/_search
{
    "query": {
        "prefix": {
            "field_name": "a"
        }
    }
}

または 部分一致

注:盲目的に部分一致を使用して[〜#〜]しない[〜#〜]が使用されますが、アナライザーの正しい使用にはコーナーケースがありますほとんど常に良いです。

また、この正確なクエリはLIKE '%a%'と同等です。これも、マッピングと通常のクエリ検索を正しく使用すると、より適切に設定できます。

GET /my_index/table_name/_search
{
    "query": {
        "match_phrase": {
            "field_name": "a"
        }
    }
}

ESを同様に検索して同様に検索することについてこの疑問を読んでいる場合は、 Edge-ngrams を読むことをお勧めします。 =)

GET /indexName/table_name/_search
{
    "query": {
        "match_phrase": {
            "field_name": "your partial text"
        }
    }
}

"type" : "phrase_prefix"を使用して、修正をプレフィックスまたはポストすることができますJava同じコード:

AndFilterBuilder andFilterBuilder = FilterBuilders.andFilter();
 andFilterBuilder.add(FilterBuilders.queryFilter(QueryBuilders.matchPhraseQuery("field_name",
          "your partial text")));

必要に応じて追加のフィルターを追加できるように、「およびフィルター」の例を示します。詳細については、これを確認してください:

https://www.elastic.co/guide/en/elasticsearch/guide/current/slop.html

2
Pranav Mishra