ElasticSearch用于带空格的术语

Han*_*tie 7 elasticsearch

我们正在运行ElasticSearch,并且在搜索包含空格的术语时遇到一些问题.一个具体的例子:有一个名叫JM Bruno的人,但是在搜索时没有返回任何结果.我隐约记得搜索这个确切的术语确实返回了结果,但我现在无法重现.

我尝试在我的tokenizer模式中添加一个空格和"\",没有太多运气.ES设置如下(在Ruby on Rails应用程序中使用Tire gem)

module Search
def self.included base
base.send :include, Tire::Model::Search
base.send :include, Tire::Model::Callbacks

base.class_eval do
  settings  analysis: {
              filter: {
                ngram: {
                  type: 'nGram',
                  max_gram: 12,
                  min_gram: 3
                },
                url_stop: {
                  type: "stop",
                  stopwords: %w[http https]
                }
              },
              tokenizer: {
                url_email_tokenizer: {
                  pattern: '[^\w\-\.@]+',
                  type: 'pattern'
                }
              },
              analyzer: {
                url_analyzer: {
                  tokenizer: "url_email_tokenizer",
                  filter: %w[url_stop ngram],
                  type: "custom"
                },
                name_analyzer: {
                  tokenizer: 'url_email_tokenizer',
                  filter: 'ngram',
                  type: 'custom'
                }
              }
            }


    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我们也使用这些标记器来搜索域名和电子邮件地址.

dad*_*net 4

尝试使用您应用于字段的分析器运行_analyze API 。

curl -XGET 'localhost:9200/_analyze?analyzer=name_analyzer' -d 'JM Bruno'
Run Code Online (Sandbox Code Playgroud)

您将看到 Elasticsearch 如何将您的字段内容分解为标记,以及为什么您无法使用 TermQuery 搜索它。TermQuery 不会被分析,因此它会按照原样将您的查询与倒排索引进行比较。