DATA:
"address": "198 Mill Lane"
"address": "200 Mill, Lane"
搜索:
POST /bank/_search?pretty
{
"query": {
"match_phrase": {
"address": "Mill, Lane"
}
}
}
问题: 此搜索返回索引中的两个DATA。我只需要一个因为我被搜查了 " Mill,Lane"弹性搜索需要考虑逗号,但它不会考虑它。如何获得我的结果?请指教。
答案 0 :(得分:0)
这取决于您如何索引文档。标准标记器将根据标点,空格等从文本中提取标记。因此,您的数据会进入ES倒排索引,如" 198"," Mill"," Lane& #34;," 200"," Mill"," Lane"。所以,没有逗号。
如果你想这样搜索,你需要使用不同的标记器或将字段标记为not_analyzed
。
编辑:使用自定义分析器的解决方案
address
字段相关联:PUT /myindex
{
"settings": {
"analysis": {
"analyzer": {
"my_ngram_analyzer": {
"tokenizer": "my_ngram_tokenizer"
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "nGram",
"min_gram": "2",
"max_gram": "25",
"token_chars": [
"letter",
"digit",
"punctuation",
"whitespace"
]
}
}
}
},
"mappings": {
"mytype": {
"properties": {
"address" : {
"type" : "string",
"analyzer" : "my_ngram_analyzer"
}
}
}
}
}
phrase
类型匹配:GET /myindex/mytype/_search
{
"query": {
"match": {
"address": {
"query": "Mill, Lane",
"type": "phrase"
}
}
}
}
答案 1 :(得分:0)
如果可以不匹配" Mill,Lane"或" Mill,Lane"对于任何文档,您可以使用Elasticsearch开箱即用的whitespace
分析器。
首先,通过执行以下命令创建自定义映射(将<index name>
替换为实际索引名称):
PUT <index name>/_mapping/whitespace_analyzer
{
"whitespace_analyzer": {
"properties" : {
"address" : {
"type" : "string",
"analyzer" : "whitespace"
}
}
}
}
接下来,使用上面创建的映射使用
之类的命令索引文档POST <index name>/whitespace_analyzer
{
"address" : "198 Mill Lane"
}
POST <index name>/whitespace_analyzer
{
"address" : "200 Mill, Lane"
}
现在,您可以使用与上述相同的match_phrase
查询来获得所需的结果。
{
"query" : {
"match_phrase" : {
"address": "Mill, Lane"
}
}
}
顾名思义,whitespace
分析器用空格作为分隔符进行标记。因此,被索引的术语将是&#34; 198&#34;,&#34; Mill&#34;,&#34; Lane&#34;,&#34; 200&#34;和&#34; Mill,&#34;。如果没有明确提到,Search API使用Index API使用的相同分析器。以上是一个非常简单的分析仪。您可以学习如何构建更复杂的自定义分析器here。