Elasticsearch-按术语查找仅是给定查询字符串一部分的文档

时间:2018-11-21 12:49:33

标签: elasticsearch

我在Elasticsearch中搜索时遇到问题,希望您能提供帮助。

我想找到一个关键字标记的文档,索引中的分析器仅将其小写。当生成的术语成为搜索查询的一部分时,我希望Elasticsearch能够找到它。

示例搜索:

 "query": {
    "match": {
      "categoryNames": "CD&DVD Aufbewahrung schwarz"
    }
  }

我要查找的文档:

"_source": {
    "categoryId": 11972638,
    "categoryNames": [
        "DVD-Koffer",
        "CD-Koffer",
        "CD-Aufbewahrung",
        "DVD-Aufbwahrung",
        "DVD-Ordner",
        "EDV-DVD-Aufbewahrung",
        "EDV-CD-Aufbewahrung",
        "CD&DVD Aufbewahrung",
        "Multimediabox"
    ],
    "lvl3Id": 11972638
}

索引分析器:

"analysis" : {
    "analyzer" : {
        "default" : {
             "type": "custom",
             "tokenizer": "keyword",
             "filter" : ["lowercase"]
         }
      }
 }

我想找到的文档术语向量:

"cd&dvd aufbewahrung": {
    "term_freq": 1,
    "tokens": [
      ...
    ]
},
"cd-aufbewahrung": {
     "term_freq": 1,
     "tokens": [
       ...
      ]
},
"cd-koffer": {
      "term_freq": 1,
      "tokens": [
        ...
       ]
},
....

我没有结果。当我唯一搜索“ CD&DVD aufbewahrung”时,我找到了文件。

我认为elasticsearch试图找到一个不存在的术语“ CD&DVD Aufbewahrung schwarz”,而不是匹配“ CD&DVD Aufbewahrung”并忽略“ schwarz”。

搜索不能使用标准分析器,因为重要的是只有“ CD&DVD Aufbewahrung”才能找到“ CD&DVD Aufbewahrung”,而不是仅包含“ Aufbewahrung”或“ Aufbewahrung CD&DVD”的字词,术语通过例如分析空格。

以下示例符合我对上述文档的期望:

CD&DVD Aufbewahrung -> Found
CD&DVD aufbewahrung -> Found
schwarz CD&DVD Aufbewahrung -> Found
CD&DVD Aufbewahrung gelb -> Found
schwarz CD&DVD Aufbewahrung gelb -> Found
CD&DVD schwarz Aufbewahrung -> not Found
Aufbewahrung CD&DVD -> not Found
schwarz CD & DVD Aufbewahrung -> not Found
schwarzCD&DVD Aufbewahrung -> Not Found

有人知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:1)

也许带有Shingle Token Filter的自定义分析器在这里会有所帮助。请参见下面的代码:

映射

PUT /so53412408
{
  "settings": {
    "analysis": {
      "analyzer": {
        "lowercase_keyword": {
          "tokenizer": "keyword",
          "filter": [
            "lowercase"
          ]
        },
        "lowercase_shingle": {
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "my_shingle"
          ]
        }
      },
      "filter": {
        "my_shingle": {
          "type": "shingle",
          "min_shingle_size": 2,
          "max_shingle_size": 4
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "categoryNames": {
          "type": "text",
          "analyzer": "lowercase_keyword",
          "search_analyzer": "lowercase_shingle"
        }
      }
    }
  }
}

样本数据

POST /so53412408/_doc
{
  "categoryNames": [
    "DVD-Koffer",
    "CD-Koffer",
    "CD-Aufbewahrung",
    "DVD-Aufbwahrung",
    "DVD-Ordner",
    "EDV-DVD-Aufbewahrung",
    "EDV-CD-Aufbewahrung",
    "CD&DVD Aufbewahrung",
    "Multimediabox"
  ]
}

搜索查询

GET /so53412408/_search
{
  "query": {
    "match": {
      "categoryNames": "schwarzCD&DVD Aufbewahrung"
    }
  }
}

结果

CD&DVD Aufbewahrung              -> Found
CD&DVD aufbewahrung              -> Found
schwarz CD&DVD Aufbewahrung      -> Found
CD&DVD Aufbewahrung gelb         -> Found
schwarz CD&DVD Aufbewahrung gelb -> Found
CD&DVD schwarz Aufbewahrung      -> Not Found
Aufbewahrung CD&DVD              -> Not Found
schwarz CD & DVD Aufbewahrung    -> Not Found
schwarzCD&DVD Aufbewahrung       -> Not Found
相关问题