3

私は現在、テキストからさまざまな「キーワード」を特定するプロジェクトに取り組んでいます。

例として、次の入力テキストを想定します。

「これは、肉についてブエノスアイレスから書かれたテキストの例です」.

さらに、elasticsearch インスタンスに次のドキュメントが保存されていると仮定します。

都市: [バルセロナ、ブエノスアイレス、ロサンゼルス、...]

カテゴリ: [金融、政治、..]

入力テキストから対応する都市とカテゴリを識別する方法が必要です。

私の最初のアプローチは、"or" 演算子を使用して検索クエリを実行し、どれが最高ランクかを確認することでした。その後、一致したドキュメントとテキストを再照合して、これらのテキストが実際に存在することを確認します (つまり、「los angeles」という単語がテキスト内にあり、「los」または"アンジェレス)。

Elasticsearchでこの種のことを行うベストプラクティスの方法かどうか疑問に思っています.

4

4 に答える 4

6

私は次のことを提案します:

たとえば、次のドキュメントを作成します。

curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1'  -d '
{
   "text" : "This is an example of some text written from Buenos Aires about Meat"
}
'

Buenos Aires次に、このクエリを実行して、またはLos Angeles:を探します。

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1'  -d '
{
   "query" : {
      "constant_score" : {
         "filter" : {
            "or" : [
               {
                  "fquery" : {
                     "_name" : "buenos_aires",
                     "query" : {
                        "match_phrase" : {
                           "text" : "Buenos Aires"
                        }
                     }
                  }
               },
               {
                  "fquery" : {
                     "_name" : "los_angeles",
                     "query" : {
                        "match_phrase" : {
                           "text" : "Los Angeles"
                        }
                     }
                  }
               }
            ]
         }
      }
   }
}
'

# {
#    "hits" : {
#       "hits" : [
#          {
#             "_source" : {
#                "text" : "This is an example of some text written from Buenos Aires about Meat"
#             },
#             "_score" : 1,
#             "_index" : "test",
#             "_id" : "JIwnN_FVTv-0i5YGrlHLeg",
#             "_type" : "test",
#             "matched_filters" : [
#                "buenos_aires"
#             ]
#          }
#       ],
#       "max_score" : 1,
#       "total" : 1
#    },
#    "timed_out" : false,
#    "_shards" : {
#       "failed" : 0,
#       "successful" : 5,
#       "total" : 5
#    },
#    "took" : 58
# }

結果の要素に注意してmatched_filters、どのフィルターが一致したかを示します。

于 2013-03-04T09:40:42.750 に答える
2

これはPercolatorにも適しているようです。

別のインデックスでクエリをドキュメントとしてインデックス化し、ドキュメントをパーコレートして、一致するクエリを知ることができます。percolate APIを見てください。

( create index APIを使用して) インデックスを作成する必要があります。たとえば、それを test と呼びましょう。

curl -XPUT localhost:9200/test

次に、名前を付けて「ブエノスアイレス」クエリを登録します。DrTech が回答で示唆しているように、マッチ フレーズ クエリは適切な選択のようです。

curl -XPUT localhost:9200/_percolator/test/buenosaires -d '{
    "query" : {
        "match_phrase" : {
            "text" : "Buenos Aires"
        }
    }
}'

次にパーコレートします。つまり、ドキュメントを送信すると、以前にインデックスを作成したクエリの中で一致するクエリが返されます。

curl -XGET localhost:9200/test/type1/_percolate -d '{
    "doc" : {
        "city" : "This is an example of some text written from Buenos Aires about Meat"
    }
}'

この場合、次の json を取得する必要があります。buenosaires は、インデックス作成中にクエリに付けた名前です。

{"ok":true, "matches":["buenosaires"]}

DrTechの答えは本当に良いです。主な違いは、テキストが実際にどこにあるかによって生じると思います。Elasticsearch で既にインデックスが作成されている場合、最善の戦略は、名前付きクエリを作成して、1 回のリクエストでドキュメントが一致するものを取得することです。

一方、データにインデックスを付けようとしていて、実際にインデックスを付ける前にドキュメントを強化する必要がある場合は、おそらくパーコレーターの方が適切です。

お役に立てれば!

于 2013-03-04T12:39:10.177 に答える
0

「キーワード」を以前にインデックス付けされた値として識別し、「ロス」「アンジェレス」などのケースを回避するための最善の策は、分析されていないフィールドに対して用語ファセット クエリを使用することです。メモリ コストに注意し、他の例についてはこちらをご覧ください。乾杯

于 2013-03-01T11:36:07.013 に答える
-2

エラスティック検索は基本的にApache Luceneの上に基づいているため、任意の Apache クエリを使用できます。

クエリ コマンド+クエリ構文

あなたの場合、「フィールド」クエリを見ることをお勧めします:

http://www.elasticsearch.org/guide/reference/query-dsl/field-query.html

于 2013-02-27T09:41:05.503 に答える