我正在尝试为建议下拉列表实现通配符。自尝试解决此问题以来,我已经有几天了。 :(

我有一家餐馆 list (4000-7000)。我想在餐厅名称中使用通配符进行搜索,并首先在文本前面显示搜索结果。

我尝试不使用分析器,使用ngram分析器和我在网上找到的许多其他解决方案但没有运气的情况下为名称字段建立索引。

现在,通过此设置可获得最佳结果:

settings:
  analysis: {
    analyzer: {
      default: {
        tokenizer: :keyword,
        filter: [:lowercase]
      }
    }
  }

索引名称字段如下所示:
indexes :name, type: :string, analyzer: :default

搜索:查询:{通配符:{名称:'* le *'}}}
结果:Orleans上的Beef先生,Miller's Pub,Maple上的Merlo,Le Bouchon,Les Nomades,Leonardo的Ristorante,Lem's Bar-BQ House,Le Petit Paris,Joy Yee's Noodles-Chinatown,J. Alexander's(Lincoln Park),印度花园-鹅岛Streeterville Brewpub-箭牌维尔,Tweet ...让我们吃饭吧,阿尔科·德·库奇耶罗斯,阿尔的#1意大利牛肉-小意大利

我希望以' le '开头的结果排在前面,并获得更高的分数。因为通常人们会搜索以它开头的餐厅。但是我不能在前面没有*进行搜索,因为我也想要包含该结果但分数较低的结果。例如在“Le Colonial”,“Le Petit Paris”,“Les Nomades”上方。

我该怎么做?

我关心的另一个问题是性能。我知道展位末尾的通配符可能是最坏的情况,但是我找不到任何解决方案,可以使ngram或带状疱疹对我有好处。

最佳答案

使用boost选择最上面的第一场比赛。

使用两个通配符查询

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
                    }
                }
            }
        ]
    }
}
}'

关于Elasticsearch通配符搜索和相关性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23195991/

10-13 00:05