私はcouchDBを使用しており、クエリにnGramsを使用しようとしているため、リバープラグインでESを使用しています。誰かがスペースを入力すると、クエリが正しく機能しないという事実を除いて、基本的に必要なことはすべて実行しました。これは、ES がクエリのすべての要素をスペースで分割してトークン化するためです。
これが私がする必要があることです:
文字列内のテキストの一部を照会します。
クエリ: "Hello Wor" 応答: "Hello World, Hello Word" / 除外 "Hello, World, Word"
指定した基準で結果を並べ替えます。
大文字小文字を区別しません。
この質問に従って、私が行ったことは次のとおりです。ElasticSearchで単語の一部を検索する方法
curl -X PUT 'localhost:9200/_river/myDB/_meta' -d '
{
"type" : "couchdb",
"couchdb" : {
"host" : "localhost",
"port" : 5984,
"db" : "myDB",
"filter" : null
},
"index" : {
"index" : "myDB",
"type" : "myDB",
"bulk_size" : "100",
"bulk_timeout" : "10ms",
"analysis" : {
"index_analyzer" : {
"my_index_analyzer" : {
"type" : "custom",
"tokenizer" : "standard",
"filter" : ["lowercase", "mynGram"]
}
},
"search_analyzer" : {
"my_search_analyzer" : {
"type" : "custom",
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "mynGram"]
}
},
"filter" : {
"mynGram" : {
"type" : "nGram",
"min_gram" : 2,
"max_gram" : 50
}
}
}
}
}
'
次に、並べ替え用のマッピングを追加します。
curl -s -XGET 'localhost:9200/myDB/myDB/_mapping'
{
"sorting": {
"Title": {
"fields": {
"Title": {
"type": "string"
},
"untouched": {
"include_in_all": false,
"index": "not_analyzed",
"type": "string"
}
},
"type": "multi_field"
},
"Year": {
"fields": {
"Year": {
"type": "string"
},
"untouched": {
"include_in_all": false,
"index": "not_analyzed",
"type": "string"
}
},
"type": "multi_field"
}
}
}
}'
完全にするために使用するすべての情報を追加しました。とにかく、このセットアップでは、結果を取得しようとするたびに、うまくいくはずだと思いますが、クエリを分割するためにスペースが引き続き使用されます。例:
http://localhost:9200/myDB/myDB/_search?q=Title:(Hello%20Wor)&pretty=true
"Hello" と "Wor" を含むものをすべて返します (通常、括弧は使用しませんが、例で見たことがありますが、結果は非常に似ているようです)。
これは私をかなり悩ませているので、どんな助けも本当に感謝しています。
更新: 最後に、nGram は必要ないことに気付きました。通常のインデックスで十分です。クエリの空白を「 AND 」に置き換えるだけでうまくいきます。
例:
Query: "Hello World" ---> Replaced as "(*Hello And World*)"