如何在弹性搜索中考虑逗号?

时间:2014-09-18 10:51:58

标签: elasticsearch

DATA:

"address": "198 Mill Lane"
"address": "200 Mill, Lane"

搜索:

 POST /bank/_search?pretty
    {
       "query": {
        "match_phrase": {
           "address": "Mill, Lane"
        }
      }
    }

问题: 此搜索返回索引中的两个DATA。我只需要一个因为我被搜查了 " Mill,Lane"弹性搜索需要考虑逗号,但它不会考虑它。如何获得我的结果?请指教。

2 个答案:

答案 0 :(得分:0)

这取决于您如何索引文档。标准标记器将根据标点,空格等从文本中提取标记。因此,您的数据会进入ES倒排索引,如" 198"," Mill"," Lane& #34;," 200"," Mill"," Lane"。所以,没有逗号。

如果你想这样搜索,你需要使用不同的标记器或将字段标记为not_analyzed

编辑:使用自定义分析器的解决方案

  • 为您的索引定义nGram分析器,并将此自定义分析器与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