Elasticsearch中的带状疱疹,为什么自定义分析器的这个例子失败了?

时间:2014-04-25 14:26:41

标签: elasticsearch

我将我的问题改为完整的卷曲娱乐脚本。这样可以更容易地重现问题(使用自定义分析器搜索失败)。我正在使用最新的ES版本

删除旧数据

curl -XDELETE "http://localhost:9200/test_shingling"

使用设置

创建索引
curl -XPOST "http://localhost:9200/test_shingling/" -d '{
  "settings": {
    "index": {
      "number_of_shards": 10,
      "number_of_replicas": 1
    },
    "analysis": {
      "analyzer": {
        "ShingleAnalyzer": {
          "tokenizer": "BreadcrumbPatternAnalyzer",
          "filter": [
            "standard",
            "lowercase",
            "filter_stemmer",
            "filter_shingle"
          ]
        }
      },
      "filter": {
        "filter_shingle": {
          "type": "shingle",
          "max_shingle_size": 2,
          "min_shingle_size": 2,
          "output_unigrams": false
        },
        "filter_stemmer": {
          "type": "porter_stem",
          "language": "English"
        }
      },
      "tokenizer": {
        "BreadcrumbPatternAnalyzer": {
          "type": "pattern",
          "pattern": " |\\$\\$\\$"
        }
      }
    }
  }
}'

定义映射

curl -XPOST "http://localhost:9200/test_shingling/item/_mapping" -d '{
  "item": {
    "properties": {
      "Title": {
        "type": "string",
        "search_analyzer": "ShingleAnalyzer",
        "index_analyzer": "ShingleAnalyzer"
      }
    }
  }
}'

创建文档

curl -XPOST "http://localhost:9200/test_shingling/item/" -d '{
  "Title":"Kyocera Solar Panel Test"
}'

测试分析仪通过

curl 'localhost:9200/test_shingling/_analyze?pretty=1&analyzer=ShingleAnalyzer' -d 'Kyocera Solar Panel Test'

等待ES同步(又名刷新索引)

curl -XPOST "http://localhost:9200/test_shingling/_refresh"

搜索" Kyocera太阳能电池板测试" FAIL

curl -XPOST "http://localhost:9200/test_shingling/item/_search?pretty=true" -d '{
  "query": {
    "term": {
      "Title": "Kyocera Solar Panel Test"
    }
  }
}'

搜索"太阳能电池板" FAIL

curl -XPOST "http://localhost:9200/test_shingling/item/_search?pretty=true" -d '{
  "query": {
    "term": {
      "Title": "Kyocera Solar Panel Test"
    }
  }
}'

搜索" Kyocera太阳能电池板测试" FAIL

curl -XPOST "http://localhost:9200/test_shingling/item/_search?pretty=true" -d '{
  "query": {
    "query_string": {
      "default_field": "Title",
      "query": "Kyocera Solar Panel Test"
    }
  }
}'

搜索"太阳能电池板" FAIL

curl -XPOST "http://localhost:9200/test_shingling/item/_search?pretty=true" -d '{
  "query": {
    "query_string": {
      "default_field": "Title",
      "query": "solar panel"
    }
  }
}'

2 个答案:

答案 0 :(得分:5)

术语查询将搜索完全匹配,并且不会将ShingleAnalyzer应用于您的查询。

因此您必须使用匹配查询,这将在搜索时将Analyzer应用于您的查询字符串。

全字搜索

curl -XPOST "http://localhost:9200/test_shingling/item/_search" -d'{
    "query": {
        "match": {
            "Title": "Kyocera Solar Panel Test"
        }
    }
}'

部分字词搜索

curl -XPOST "http://localhost:9200/test_shingling/item/_search" -d'{
    "query": {
        "match": {
            "Title": "Panel Test"
        }
    }
}'

另一个部分字词搜索

curl -XPOST "http://localhost:9200/test_shingling/item/_search" -d'{
    "query": {
        "match": {
            "Title": "Solar Panel Test"
        }
    }
}'

希望它有帮助..!

答案 1 :(得分:1)

我认为搜索query_string默认将solar panel视为solarpanel,您必须在query_string中明确设置。这就是reference guide中的内容。

  

default_operator:

     

如果未指定显式运算符,则使用默认运算符。例如,使用OR的默认运算符,匈牙利的查询资本将转换为OR匈牙利的资本OR,并且使用AND的默认运算符,相同的查询将转换为AND匈牙利的资本AND。默认值为OR。