0

メッセージのタグを ElasticSearch に保存したいと考えています。tags フィールドを次のように定義しました。

{
  'tags': {
    'type': 'string',
    'index_name': 'tag'
  }
}

メッセージの場合、次のリストをタグ フィールドに保存しました。

['a','b','c']

次のクエリでタグ「b」を検索しようとすると、メッセージとタグが返されます。

{
  'filter': {
    'limit': {
      'value': 100
    }
  },
  'query': {
    'bool': {
      'should': [
        {
          'text': {
            'tags': 'b'
          }
        }
      ],
      'minimum_number_should_match': 1
    }
  }
}

タグ 'c' についても同様です。しかし、これでタグ「a」を検索すると:

{
  'filter': {
    'limit': {
      'value': 100
    }
  },
  'query': {
    'bool': {
      'should': [
        {
          'text': {
            'tags': 'a'
          }
        }
      ],
      'minimum_number_should_match': 1
    }
  }
}

それはまったく結果を返しません!答えは次のとおりです。

{
  'hits': {
    'hits': [],
    'total': 0,
    'max_score': None
  },
  '_shards': {
    'successful': 5,
    'failed': 0,
    'total': 5
  },
  'took': 1,
  'timed_out': False
}

私は何を間違っていますか?('a' がリストの最初の要素であることは問題ではありません。同じことが ['b','a','c'] にも当てはまります。単一の 'a' 文字でのみ問題があるようです。 .

4

2 に答える 2

1

アナライザーとインデックスへのマッピングを設定しなかった場合、Elasticsearch はデフォルトで独自のアナライザーを使用します。Elasticsearchdefault_analyzerには、次のような英語のストップワードをデフォルトで無視するストップワード フィルターがあります。

   "a", "an", "and", "are", "as", "at", "be", "but", "by",
  "for", "if", "in", "into", "is", "it",
  "no", "not", "of", "on", "or", "such",
  "that", "the", "their", "then", "there", "these",
  "they", "this", "to", "was", "will", "with"

詳細を確認する前に、ElasticSearch マッピングとアナライザー ガイドを確認してください。

于 2013-07-30T14:05:34.650 に答える
0

いくつかのステミングまたはストップ ワード リストが関係している可能性があります。フィールドが分​​析されていないことを確認してください。

'tags': {'type': 'string', 'index_name': 'tag', "index" : "not_analyzed"}

同様:elasticsearchで文字列全体をダッシュ​​と一致させる

于 2013-07-30T13:22:44.347 に答える