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
    }
  ]
}

知道如何解决这个问题的任何想法?

这很有趣,但是当我写问题时,我想出了解决方案。

问题是,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"
  }
}

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

有一个很棒的工具叫做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}   

以下是在列表中向上移动synonyms令牌筛选器后分析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: 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}    

最新更新