非常感谢@Random,我对映射进行了如下修改。为了进行测试,我使用“电影”作为索引类型。注意:我还添加了search_analyzer。没有那我没有得到适当的结果。但是我对使用search_analyzer有以下疑问。
1]如果是语言分析器,我们可以使用自定义search_analyzer吗?
2]我是否由于使用过的n-gram分析器而不是由于英语分析器而获得了所有结果?
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "whitespace"
},
"search_analyzer":{
"type": "custom",
"tokenizer": "whitespace",
"filter": "lowercase"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
},
"mappings": {
"movie": {
"properties": {
"title": {
"type": "string",
"fields": {
"en": {
"type": "string",
"analyzer": "english_ngram",
"search_analyzer": "search_analyzer"
}
}
}
}
}
}
}
更新:
使用搜索分析器也无法始终如一地工作,因此需要更多帮助。
我按照建议使用了以下映射(注意:此映射不使用搜索分析器),为简单起见,我们仅考虑英语分析器。
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "standard"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
}
}
创建的索引:
放置http:// localhost:9200 / movies / movie /
1
{"title":"$peci@l movie"}
尝试以下查询:
GET http://localhost:9200/movies/movie/_search
{
"query": {
"multi_match": {
"query": "$peci mov",
"fields": ["title"],
"operator": "and"
}
}
}
}
我没有结果,我做错了吗?我正在尝试获得以下结果:
1] Special characters
2] Partial matches
3] Space separated partial and full words
再次感谢 !
您可以基于语言分析器创建自定义分析器。唯一的区别是您将ngram_filter
令牌过滤器添加到链的末尾。在这种情况下,您首先会获得语言梗阻的令牌(默认链),这些令牌最终会转换为边缘ngram(您的过滤器)。您可以在这里https://www.elastic.co/guide/zh-
cn/elasticsearch/reference/current/analysis-lang-analyzer.html#english-
analyzer
中找到语言分析器的实现,以覆盖它们。这是英语更改的示例:
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "standard"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
}
}
更新
要支持特殊字符,您可以尝试使用whitespace
标记符代替standard
。在这种情况下,这些字符将成为令牌的一部分:
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "whitespace"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
}
}
我已经实现了一个基于lucene的软件来索引超过1000万的人名,这些人名可以用不同的方式书写,比如“Luíz”和“Luis”。索引是使用各个标记的语音值创建的(创建了一个自定义分析器)。 目前,我正在使用QueryParser查询一个给定的名称,结果很好。但是,在《Lucene in Action》一书中提到,SpanarQuery可以使用标记的接近性来改进我的查询。我对名称的非拼音索引使用了S
我需要在MongoDB上编写一些复杂的查询和一些简单的查询。我可以将MongoRepository用于简单查询,将MongoTemplate与查询或条件一起用于复杂查询实现相同的应用程序吗。 在相同的应用程序中同时使用MongoTemplate和MongoRepositories,这是一个好的设计吗。这种方法有什么缺点吗。 还有,编写包含大量谓词的复杂查询的最佳方法是什么,这些谓词涉及and、or
问题内容: 我正在使用Django 1.4,Haystack 2 beta和ElasticSearch .20运行安装程序。我的数据库是PostgreSQL 9.1,它有几百万条记录。当我尝试使用haystack / elasticsearch索引所有数据时,该过程超时,并且收到一条消息,提示“已杀死”。到目前为止,我已经注意到以下几点: 我确实获得了要建立索引的文档数量,因此没有出现“ 0个要建
问题内容: 我已经下载了包含技能分类法的onet数据集,并将其上传到了Elasticsearch中。在技能分类中,有一些技能,例如c ++ 、. net,C#。我想给c#并且只获得c#的技能。通过检查一些链接,我已如下设置索引的映射和设置。 当我使用如下查询 我正在获得所有具有“ c”的技能 当我使用以下查询时假设应用了分析器 我得到空输出。我是否正确包括了分析仪,或者我的查询错误? 问题答案
问题内容: 我使用以下命令通过请求创建索引: 但这返回以下错误: 我发送的json似乎有效。此错误的原因是什么? 我正在使用ES 2.2.0。 问题答案: 由于错误消息描述了自定义分析仪,例如 不是映射中选项的有效值。根据文档,它只能采用的值是 没有 不要将此字段值添加到索引中。使用此设置,该字段将不可查询。 not_analyzed 将字段值不变地添加到索引中,作为一项。这是所有支持此选项的字段
问题内容: 我一直在与ElasticSearch一起玩我的一个新项目。我已将默认分析器设置为使用ngram tokenfilter。这是我的elasticsearch.yml文件: 我创建了一个新索引并向其中添加了以下文档: 但是,当我使用查询或任何其他部分术语进行搜索时,ElasticSearch不会返回此文档。仅当我搜索确切的字词(如)时,它才会返回文档。 我还尝试过更改配置文件,以便defa