Elasticsearch - 语言分析字段中的同义词产生的术语与

时间:2016-03-10 13:22:36

标签: elasticsearch

同义词,关键词和语言分析师不能一起工作。

我有以下设置:

POST index1
{
  "settings": {
    "analysis": {
      "filter": {
        "english_keywords": {
          "keywords": [
            ""
          ],
          "type": "keyword_marker"
        },
        "english_stemmer": {
          "type": "stemmer",
          "language": "english"
        },
        "english_stop": {
          "type": "stop",
          "stopwords": [
            "_english_"
          ]
        },
        "synonyms": {
          "ignore_case": "true",
          "type": "synonym",
          "synonyms": ["Foo,Fruits=>Apples"],
          "tokenizer": "keyword"
        },
        "english_possessive_stemmer": {
          "type": "stemmer",
          "language": "possessive_english"
        }
      },
      "analyzer": {
        "english_synonyms": {
          "filter": [
            "lowercase",
            "asciifolding",
            "english_stop",
            "english_keywords",
            "english_stemmer",
            "english_possessive_stemmer",
            "synonyms"
          ],
          "type": "custom",
          "tokenizer": "keyword"
        }
      }
    }
  },
  "mappings": {
    "myType": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "english_synonyms"
        }
      }
    }
  }
}

POST index1/myType
{
  "name": "Apples"
}

因此,当分析apples转为appl时,您可能已经知道问题是什么,这会导致match查询无法正常运行。

请参阅_analyze API的以下结果。

GET index1/_analyze?field=name&text=fruits
{
  "tokens": [
    {
      "token": "fruit",
      "start_offset": 0,
      "end_offset": 6,
      "type": "word",
      "position": 0
    }
  ]
}
GET index1/_analyze?field=name&text=apples
{
  "tokens": [
    {
      "token": "appl",
      "start_offset": 0,
      "end_offset": 6,
      "type": "word",
      "position": 0
    }
  ]
}
GET index1/_analyze?field=name&text=foo
{
  "tokens": [
    {
      "token": "apples",
      "start_offset": 0,
      "end_offset": 3,
      "type": "SYNONYM",
      "position": 0
    }
  ]
}

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

这很有趣,但在我写这些问题时,我解决了这个问题。

问题是,Elasticsearch显然是在文本中逐个运行过滤器,从第一个开始,直到最后一个。所以我所做的只是改变过滤器的顺序。

所以这个:

"analyzer":{  
  "english_synonyms":{  
    "filter":[  
      "lowercase",
      "asciifolding",
      "english_stop",
      "english_keywords",
      "english_stemmer",
      "english_possessive_stemmer",
      "synonyms"
    ],
    "type":"custom",
    "tokenizer":"keyword"
  }
}

成为这个:

"analyzer":{  
  "english_synonyms":{  
    "filter":[  
      "lowercase",
      "asciifolding",
      "synonyms",
      "english_stop",
      "english_keywords",
      "english_stemmer",
      "english_possessive_stemmer"
    ],
    "type":"custom",
    "tokenizer":"keyword"
  }
}

我希望这有助于任何遇到这种情况的人。

答案 1 :(得分:0)

这是一款名为elyzer的优秀工具,可用于在分析过程的每个步骤中直观显示令牌的外观。这通常有助于发现问题。

以下是使用原始设置分析fruits时的输出:

$ elyzer --es localhost:9200 --index test --analyzer english_synonyms --text fruits
TOKENIZER: keyword
{0:fruits}  
TOKEN_FILTER: lowercase
{0:fruits}  
TOKEN_FILTER: asciifolding
{0:fruits}  
TOKEN_FILTER: english_stop
{0:fruits}  
TOKEN_FILTER: english_keywords
{0:fruits}  
TOKEN_FILTER: english_stemmer
{0:fruit}   
TOKEN_FILTER: english_possessive_stemmer
{0:fruit}   
TOKEN_FILTER: synonyms
{0:fruit}   

以下是在列表中移动fruits令牌过滤器后分析synonyms时的输出:

$ elyzer --es localhost:9200 --index test --analyzer english_synonyms --text fruits
TOKENIZER: keyword
{0:fruits}  
TOKEN_FILTER: lowercase
{0:fruits}  
TOKEN_FILTER: asciifolding
{0:fruits}  
TOKEN_FILTER: synonyms
{0:apples}  
TOKEN_FILTER: english_stop
{0:apples}  
TOKEN_FILTER: english_keywords
{0:apples}  
TOKEN_FILTER: english_stemmer
{0:appl}    
TOKEN_FILTER: english_possessive_stemmer
{0:appl}