我正在尝试为建议下拉列表实现通配符。自从我试图找出这个以来,我已经有几天了。 :(
我有一份餐馆名单(4000-7000)。我想在餐馆名称中使用通配符进行搜索,并首先显示搜索位于文本前面的结果。
我试图在没有分析器的情况下索引名称字段,使用ngram分析器和我在网上找到的许多其他解决方案,但没有运气。
现在最好的结果我得到了这个设置:
settings:
analysis: {
analyzer: {
default: {
tokenizer: :keyword,
filter: [:lowercase]
}
}
}
索引名称字段如下:
indexes :name, type: :string, analyzer: :default
搜索:query:{wildcard:{name:'* le *'}}
结果:奥尔良牛肉先生,Miller's Pub,Merlo on Maple,Le Bouchon,Les Nomades,Leonardo's Ristorante,Lem's Bar-BQ House,Le Petit Paris,Joy Yee's Noodles - Chinatown,J。Alexander's (林肯公园),印度花园 - Streeterville,Goose Island Brewpub - Wrigleyville,Tweet ...让我们吃!,Arco de Cuchilleros,Al's#1意大利牛肉 - 小意大利
我希望以“ le ”开头的结果在前面,以获得更高的分数。因为通常人们会搜索一个以餐馆开头的餐馆。但是我不能在没有*的情况下进行搜索,因为我确实也想要包含此结果但结果中得分较低的结果。例如,上面的'Le Colonial','Le Petit Paris','Les Nomades'应该在前面。
我该如何做到这一点?
另一个问题是我的表现。我知道展位中的通配符结束了,这是最糟糕的情况,但我找不到任何解决方案,可以给我一些关于ngram或shingle的结果。
答案 0 :(得分:11)
使用提升选择最上面的第一场比赛。
使用两个通配符查询
curl -XPOST "http://hostname:9200/index/type/_search" -d'
{
"size": 2000,
"query": {
"bool": {
"should": [
{
"wildcard": {
"name": {
"value": "*le*"
}
}
},
{
"wildcard": {
"name": {
"value": "le*",
"boost": 5
}
}
}
]
}
}
}'
使用一个通配符和一个前缀查询
curl -XPOST "http://hostname:9200/index/type/_search" -d'
{
"size": 2000,
"query": {
"bool": {
"should": [
{
"wildcard": {
"name": {
"value": "*le*"
}
}
},
{
"prefix": {
"name": {
"value": "le",
"boost": 2
}
}
}
]
}
}
}'