16

私はelasticsearchを初めて使用し、同義語を使用したいので、構成ファイルに次の行を追加しました:

index :
    analysis :
        analyzer : 
            synonym :
                type : custom
                tokenizer : whitespace
                filter : [synonym]
        filter :
            synonym :
                type : synonym
                synonyms_path: synonyms.txt

次に、インデックス テストを作成しました。

"mappings" : {
  "test" : {
     "properties" : {
        "text_1" : {
           "type" : "string",
           "analyzer" : "synonym"
        },
        "text_2" : {
           "search_analyzer" : "standard",
           "index_analyzer" : "synonym",
           "type" : "string"
        },
        "text_3" : {
           "type" : "string",
           "analyzer" : "synonym"
        }
     }
  }

}

そして、このデータで型テストを挿入しました:

{
"text_3" : "foo dog cat",
"text_2" : "foo dog cat",
"text_1" : "foo dog cat"
}

synonyms.txt には "foo,bar,baz" が含まれており、foo を検索すると期待どおりの結果が返されますが、baz または bar を検索するとゼロの結果が返されます。

{
"query":{
"query_string":{
    "query" : "bar",
    "fields" : [ "text_1"],
    "use_dis_max" : true,
    "boost" : 1.0
}}} 

結果:

{
"took":1,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"failed":0
},
"hits":{
"total":0,
"max_score":null,
"hits":[
]
}
}
4

1 に答える 1

20

あなたの問題が「バー」の同義語を間違って定義したことが原因であるかどうかはわかりません。あなたがかなり新しいと言ったように、私はあなたに似た例を挙げます。Elasticsearch が検索時とインデックス時にシノニムをどのように処理するかを示したいと思います。それが役に立てば幸い。

まず、シノニム ファイルを作成します。

foo => foo bar, baz

次に、テストしようとしている特定の設定でインデックスを作成します。

curl -XPUT 'http://localhost:9200/test/' -d '{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "whitespace",
            "filter": ["synonym"]
          }
        },
        "filter" : {
          "synonym" : {
              "type" : "synonym",
              "synonyms_path" : "synonyms.txt"
          }
        }
      }
    }
  },
  "mappings": {

    "test" : {
      "properties" : {
        "text_1" : {
           "type" : "string",
           "analyzer" : "synonym"
        },
        "text_2" : {
           "search_analyzer" : "standard",
           "index_analyzer" : "standard",
           "type" : "string"
        },
        "text_3" : {
           "type" : "string",
           "search_analyzer" : "synonym",
           "index_analyzer" : "standard"
        }
      }
    }
  }
}'

synonyms.txt は構成ファイルと同じディレクトリにある必要があることに注意してください。これは、そのパスが構成ディレクトリに対して相対的であるためです。

ドキュメントのインデックスを作成します。

curl -XPUT 'http://localhost:9200/test/test/1' -d '{
  "text_3": "baz dog cat",
  "text_2": "foo dog cat",
  "text_1": "foo dog cat"
}'

今検索

フィールド text_1 での検索

curl -XGET 'http://localhost:9200/test/_search?q=text_1:baz'
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.15342641,
    "hits": [
      {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 0.15342641,
        "_source": {
          "text_3": "baz dog cat",
          "text_2": "foo dog cat",
          "text_1": "foo dog cat"
        }
      }
    ]
  }
}

baz は foo のシノニムであり、インデックス時に foo がそのシノニムで展開されるため、ドキュメントを取得します

フィールド text_2 での検索

curl -XGET 'http://localhost:9200/test/_search?q=text_2:baz'

結果:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

索引作成時に同義語を展開しなかったため、ヒットしません (標準アナライザー)。また、baz を検索していて、テキストに baz が含まれていないため、結果が得られません。

フィールド text_3 での検索

curl -XGET 'http://localhost:9200/test/_search?q=text_3:foo'
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.15342641,
    "hits": [
      {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 0.15342641,
        "_source": {
          "text_3": "baz dog cat",
          "text_2": "foo dog cat",
          "text_1": "foo dog cat"
        }
      }
    ]
  }
}

注: text_3 は「baz dog cat」です。

text_3 は同義語を展開しないインデックスでした。同義語の 1 つとして「baz」を持つ foo を検索していると、結果が得られます。

デバッグしたい場合は_analyze、たとえば次のようにエンドポイントを使用できます。

curl -XGET 'http://localhost:9200/test/_analyze?text=foo&analyzer=synonym&pretty=true'

結果:

{
  "tokens": [
    {
      "token": "foo",
      "start_offset": 0,
      "end_offset": 3,
      "type": "SYNONYM",
      "position": 1
    },
    {
      "token": "baz",
      "start_offset": 0,
      "end_offset": 3,
      "type": "SYNONYM",
      "position": 1
    },
    {
      "token": "bar",
      "start_offset": 0,
      "end_offset": 3,
      "type": "SYNONYM",
      "position": 2
    }
  ]
}
于 2013-08-23T19:39:04.213 に答える