如何忽略elasticsearch中的撇号?

时间:2018-03-15 11:13:22

标签: node.js elasticsearch analyzer

如何忽略elasticsearch中的撇号?

让我们说我正在寻找字符串swarm: https: keystore: path: ${project.build.directory}/keystore.jks password: password 。我希望能够在发送以下字词时对其进行匹配:Paul'spauls

这就是我的索引的配置如下:(我已尝试使用自定义分析器执行此操作,但它不起作用):

paul's

1 个答案:

答案 0 :(得分:3)

在搜索pauls时,词干分析器对您没有帮助。为此,你需要忽略撇号'。下面我在title字段中添加了一个新的子字段,该字段使用char_filter忽略撇号。但在搜索本身中,您需要使用主要字段 - title - 和子字段 - title.no_stemmer

DELETE test
PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase",
            "my_stemmer"
          ]
        },
        "no_stemmer_analyzer": {
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase"
          ],
          "char_filter": "my_char_filter"
        }
      },
      "filter": {
        "my_stemmer": {
          "type": "stemmer",
          "name": "possessive_english"
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",
          "mappings": [
            "'=>"
          ]
        }
      }
    }
  },
  "mappings": {
    "my_type": {
      "properties": {
        "description": {
          "type": "text"
        },
        "title": {
          "type": "text",
          "analyzer": "my_analyzer",
          "fields": {
            "no_stemmer": {
              "type": "text",
              "analyzer": "no_stemmer_analyzer"
            }
          }
        }
      }
    }
  }
}

POST test/my_type/_bulk
{"index":{}}
{"title":"Paul's"}
{"index":{}}
{"title":"Paul"}
{"index":{}}
{"title":"Pauls"}

GET test/_search
{
  "query": {
    "multi_match": {
      "fields": ["title", "title.no_stemmer"],
      "query": "Paul's"
    }
  }
}