我正在使用带有河流插件的 ES,因为我正在使用 couchDB,并且我正在尝试使用 nGrams 进行查询。我基本上已经完成了我需要的所有事情,除了当有人输入空格时,查询无法正常工作。这是因为 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*)"