Elasticsearch - 用撇号搜索单词

时间:2013-01-22 10:22:40

标签: elasticsearch

我希望能够搜索以下单词

文森特 文森 Vincent的

目前,数据库和ES中的测试是Vincent的

是否有可能检测到所有格并忽略撇号。 我看过Word-Delimiter但似乎无法在这个

上找到合适的解释

3 个答案:

答案 0 :(得分:7)

您需要了解elasticsearch的分析仪的工作原理。分析器执行标记化(将输入拆分为一堆标记,例如在空格上)和一组标记过滤器(过滤掉您不想要的标记,如stop words)或修改标记,如{ {3}}将所有内容转换为小写。)

分析是在两个非常特定的时间执行的 - 在索引期间(当您将内容放入elasticsearch时),并且根据您的查询,在搜索期间(在您正在搜索的字符串上)。

也就是说,默认分析器是lowercase token filter,其中包含standard analyzerstandard tokenizer(用于清除标准标记生成器中的标记),standard token filter和{ {3}}

举一个例子,当你保存字符串“我爱文森特的馅饼!”进入elasticsearch,你正在使用默认的标准分析器,你实际上存储的是“我”,“爱”,“文森特”,“s”,“馅饼”。然后,当您尝试使用term查询(未分析)搜索“Vincent's”时,您将找不到任何内容,因为“Vincent's”不是其中一个令牌!但是,如果您使用match查询(已分析)搜索“Vincent's”,您会发现“我爱文森特的馅饼!”因为“vincent”和“s”都找到了匹配。

底线是:

  1. 在搜索自然语言字符串时使用分析的查询,例如match
  2. 设置分析仪以满足您的需求。你可以设置一个自定义分析器,它可以执行空格标记器或字母标记器或模式标记器,如果你想变得复杂,以及你想要的任何过滤器。这取决于你的用例,但如果你正在处理自然语言句子,我不建议这样做,因为标准的标记器是为自然语言搜索而构建的。
  3. 有关详细信息,请参阅lowercase token filter

答案 1 :(得分:3)

使用" possessive_english" ES文档中描述的词干分析器: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-stemmer-tokenfilter.html

示例:

{
  "index" : {
    "analysis" : {
        "analyzer" : {
            "my_analyzer" : {
                "tokenizer" : "standard",
                "filter" : ["standard", "lowercase", "my_stemmer"]
            }
        },
        "filter" : {
            "my_stemmer" : {
                "type" : "stemmer",
                "name" : "possessive_english"
            }
        }
    }
  }
}

未经测试的代码,但应该有效。这是" word_delimiter":

的测试示例
{
  "index" : {
    "analysis" : {
        "analyzer" : {
            "my_analyzer" : {
                "tokenizer" : "standard",
                "filter" : ["standard", "lowercase", "my_word_delimiter"]
            }
        },
        "filter" : {
            "my_word_delimiter" : {
                "type" : "word_delimiter",
                "preserve_original": "true"
            }
        }
    }
  }
}

适合我:-) ES docs: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-word-delimiter-tokenfilter.html

答案 2 :(得分:-1)

使用匹配查询搜索Apostrophe这个单词。

{
   "query": {
      "bool": {
         "must": [
           {
             "match": {
                  "_all": "Vincent Vincents Vincent's"
                 }
              }
            ]
         }
     }
}
相关问题