0

インデックスに単純なレコードがあります

CharacterId=847 
  • クエリは結果を返します(とを別々CharacterId=8に検索するようですCharacterId8
  • クエリCharacterId=は結果を返します
  • クエリCharacterId=*は何も返さない
  • クエリCharacter*は結果を返します
  • クエリCharacterId=8*は何も返さない
4

1 に答える 1

4

あなたの質問は「なぜelasticsearchがそうするのですか」だと思いますか?この質問に答えるには、レコードがどのように索引付けされたかを調べる必要があります。デフォルトのアナライザーを使用していたと仮定すると、レコードが 2 つの用語characteridととしてインデックス化されていることがわかり847ます。

$ curl "localhost:9200/twitter/_analyze?pretty=true" -d 'CharacterId=847'
{
  "tokens" : [ {
    "token" : "characterid",
    "start_offset" : 0,
    "end_offset" : 11,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "847",
    "start_offset" : 12,
    "end_offset" : 15,
    "type" : "<NUM>",
    "position" : 2
  } ]
}

次に、クエリを見てみましょう。

$ curl "localhost:9200/twitter/_validate/query?explain=true&pretty=true" -d '{
    "query_string": {"query":"CharacterId=8"}
}' 
{
  "valid" : true,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "explanations" : [ {
    "index" : "twitter",
    "valid" : true,
    "explanation" : "_all:characterid _all:8"
  } ]
}

おっしゃる通り、このクエリは用語characteridまたは用語を検索しています8。用語はレコードの最初の用語characteridと一致し、結果が返されます。

2 番目のクエリも同様の効果がありますが、1 つの用語のみを検索しますcharacterid

$ curl "localhost:9200/twitter/_validate/query?explain=true&pretty=true" -d '{
    "query_string": {"query":"CharacterId="}
}' 
...
    "explanation" : "_all:characterid"
...

3 番目のクエリは、ワイルドカード クエリとして処理されます。

$ curl "localhost:9200/twitter/_validate/query?explain=true&pretty=true" -d '{
    "query_string": {"query":"CharacterId=*"}
}'
...
    "explanation" : "_all:characterid=*"
...

ご覧のとおり、文字で始まるすべての用語が検索されますcharacterid=。あなたのインデックスにはそのような用語がないため、何も見つかりません。

4 番目のクエリは、ワイルドカード クエリとして再び処理されます。

$ curl "localhost:9200/twitter/_validate/query?explain=true&pretty=true" -d '{
    "query_string": {"query":"Character*"}
}'   
...
    "explanation" : "_all:character*"
...

ただし、今回は で始まる用語を検索するため、用語characterに一致しcharacteridます。

最後のクエリは 3 番目のクエリに似ています。

$ curl "localhost:9200/twitter/_validate/query?explain=true&pretty=true" -d '{
    "query_string": {"query":"CharacterId=8*"}
}'
...
    "explanation" : "_all:characterid=8*"
...

で始まる用語はありませんcharacterid=8。これらのため、レコードは返されません。

これが必要な動作でない場合は、このフィールドをまったく分析しないか、小文字のアナライザーのみを使用することを検討してください。

于 2012-07-26T14:31:50.723 に答える