0

ファセットがスペースでタグをトークン化することに問題があります。

私は次のマッピングを持っています:

    curl -XPOST "http:// localhost:9200 / pictures" -d '
    {{
      「マッピング」:{
        "ピクチャー" : {
                "プロパティ" : {
                    "id":{"type": "string"}、
                    "description":{"type": "string"、 "index": "not_analyzed"}、
                    "featured":{"type": "boolean"}、
                    "categories":{"type": "string"、 "index": "not_analyzed"}、
                    "tags":{"type": "string"、 "index": "not_analyzed"、 "analyzer": "keyword"}、
                    "created_at":{"type": "double"}
                }
            }
        }
    } '

そして私のデータは:

    curl -X POST "http:// localhost:9200 / pictures / pictures" -d'{
      "写真": {
        "id": "4defe0ecf02a8724b8000047"、
        「タイトル」:「ビクトリアシークレットフォトシュート」、
        「説明」:「フランスとイタリアから」、
        「注目」:true、
        「カテゴリ」:[
          "ファッション"、
          「ガールズ」、
        ]、
        「タグ」:[
          "女の子"、
          "写真撮影"、
          「スーパーモデル」、
          "ヴィクトリア・シークレット"
        ]、
        "created_at":1405784416.04672
      }
    } '

そして私のクエリは次のとおりです。

    curl -X POST "http:// localhost:9200 / pictures / _search?pretty = true" -d '
    {{
      "クエリ":{
        "文章": {
          「タグ」:{
            "クエリ":"ビクトリアシークレット"
          }
        }
      }、
      「ファセット」:{
        「タグ」:{
          "条項": {
            "フィールド":"タグ"
          }
        }
      }
    } '

出力結果は次のとおりです。

    {{
      「取った」:1
      "timed_out":false、
      "_shards":{
        「合計」:5
        「成功」:5、
        「失敗」:0
      }、
      「ヒット」:{
        「合計」:0、
        "max_score":null、
        「ヒット」:[]
      }、
      「ファセット」:{
        「タグ」:{
          "_type": "terms"、
          「行方不明」:0、
          「合計」:0、
          「その他」:0、
          "条項" : [ ]
        }
      }
    }

今、私はファセットで合計0を取得し、ヒット
で合計0を取得し ました。タグからキーワードアナライザー
を削除して「not_analyzed」にすると、結果が得られることを知っています。 ただし、大文字と小文字を区別するという問題がまだあります。キーワードアナライザーを削除して 上記のクエリを実行すると、次のような結果が得られます。


    ファセット:{
        タグ:{
            _type:用語
            行方不明:0
            合計:12
            その他:0
            条項: [
                {{
                    用語:写真撮影
                    カウント:1
                }
                {{
                    用語:女の子
                    カウント:1
                }
                {{
                    用語:ビクトリアシークレット
                    カウント:1
                }
                {{
                    用語:スーパーモデル
                    カウント:1
                }         
            ]
        }

    }


ここで、 Victoria Secret「not_analyzed」では大文字と小文字を区別しますが、カウントにスペースが必要ですが、「victoria secret」として小文字でクエリを実行しても、結果は得られません。


助言がありますか??

ありがとう、
Suraj

4

2 に答える 2

4

最初の例は私には完全には明らかではありません。KeyboardAnalyzerを使用する場合は、フィールドがそのままインデックスに登録されることを意味しますが、フィールドをまったく分析しない方がはるかに理にかなっています。これは同じです。投稿したマッピングには両方が含まれています

"index": "not_analyzed", "analyzer": "keyword"

これはあまり意味がありません。フィールドを分析していない場合、なぜそのためのアナライザーを選択するのでしょうか。

これとは別に、もちろん、フィールドを分析しないと、タグVictoria Secretはそのままインデックスに登録されるため、クエリvictoria secretは一致しません。大文字と小文字を区別しないようにする場合は、KeyworkTokenizerとLowercaseTokenFilterをトークン化する必要がないため、KeyworkTokenizerを使用するカスタムアナライザーを定義する必要あります。インデックス設定分析セクションでカスタムアナライザーを定義し、それをマッピングで使用できます。しかし、そうすれば、ファセットは常に小文字になります。これは、私が推測するのが好きではないことです。そのため、マルチフィールドを定義し、ファセット用と検索用の2つの異なるテキスト分析を使用してフィールドにインデックスを付ける方が適切です。

次のようにインデックスを作成できます。

curl -XPOST "http://localhost:9200/pictures" -d '{
    "settings" : {
        "analysis" : {
            "analyzer" : {
              "lowercase_analyzer" : {
                "type" : "custom",
                "tokenizer" : "keyword",
                "filter" : [ "lowercase"]
              }
            }
        }
    },
    "mappings" : {
        "pictures" : {
            "properties" : {
                "id": { "type": "string" },
                "description": {"type": "string", "index": "not_analyzed"},
                "featured": { "type": "boolean" },
                "categories": { "type": "string", "index": "not_analyzed" },
                "tags" : {
                    "type" : "multi_field",
                    "fields" : {
                        "tags": { "type": "string", "analyzer": "lowercase_analyzer" },
                        "facet": {"type": "string", "index": "not_analyzed"},
                    }
                },
                "created_at": { "type": "double" }
            }
        }
    }
}'

次に、カスタムのlowercase_analyzerは、そのフィールドを検索するときにデフォルトでテキストクエリにも適用されるため、Victoria Secretまたはvictoria secretを検索して結果を返すことができます。ファセット部分を変更し、tags.facet分析されていない新しいフィールドにファセットを作成する必要があります。

さらに、テキストクエリは最新のelasticsearchバージョン(0.19.9)で非推奨になっているため、一致クエリを確認することをお勧めします。

于 2012-08-29T14:19:11.767 に答える
0

これは私の答えには意味があると思います

https://gist.github.com/2688072

于 2012-08-22T10:57:49.827 に答える