【问题标题】:How can I search with Unicode characters in elasticsearch?如何在 elasticsearch 中使用 Unicode 字符进行搜索?
【发布时间】:2017-12-31 07:33:33
【问题描述】:

我已将 MySQL 列索引到 elasticsearch 中,并且该列具有一些 AR/EN/RO 语言值。 如何使用 unicode 字符串在这些索引中进行搜索?

$hosts = ['localhost:9200'];              
$client = \Elasticsearch\ClientBuilder::create()->setHosts($hosts)->build();  

$body = '{  "query": {
"filtered": {
  "query": {
    "match_all": {}
  },
  "filter": {
    "bool": {
      "must": [
        {"query": {"wildcard": {"text": {"value": "*'.$term.'*"}}}},
        {"query": {"wildcard": {"group": {"value": "hotels_cities"}}}}
      ]
    }
  }
}  }}';



$params['index'] = 'my_custom_index_name';
$params['type']  = 'translator_translations';
$params['body'] = $body;

$results = $client->search($params);

输出命中为零。

-有一种叫做分析器的东西,但没有关于如何在 PHP 中使用它的信息。

【问题讨论】:

    标签: php mysql elasticsearch unicode


    【解决方案1】:

    我想我找到了如何在 Elasticsearch 中索引 unicode 语言字符的答案,希望这对任何人都有用。

    • 首先您必须设置您的索引名称

    • 第二使用过滤器和语言分析器设置新的语言设置,像这样:

      $client = ClientBuilder::create()       // Instantiate a new ClientBuilder
                  ->setHosts(['localhost:9200'])      // Set the hosts
                  ->build();
      
      $lang = 'el'; // Greek in my case
      
      $param['index'] = 'test_' . $lang; // index name
      
      // uncomment this line if you want to delete an existing index
      // $response = $client->indices()->delete($param);
      
      $body = '{
        "settings": {
          "analysis": {
            "filter": {
              "greek_stop": {
                "type":       "stop",
                "stopwords":  "_greek_" 
              },
              "greek_lowercase": {
                "type":       "lowercase",
                "language":   "greek"
              },
              "greek_keywords": {
                "type":       "keyword_marker",
                "keywords":   ["παράδειγμα"] 
              },
              "greek_stemmer": {
                "type":       "stemmer",
                "language":   "greek"
              }
            },
            "analyzer": {
              "greek": {
                "tokenizer":  "standard",
                "filter": [
                  "greek_lowercase",
                  "greek_stop",
                  "greek_keywords",
                  "greek_stemmer"
                ]
              }
            }
          }
        }
      }';
      
      $param['body'] = $body; // store the JSON body as a parameter in the main array
      
      $response = $client->indices()->create($param);
      

    然后开始用希腊字符索引你的值

    【讨论】:

      【解决方案2】:

      你应该使用 fieldname.keyword

      $rowArray = array();
      $rowArray['term'] = array();
      $rowArray['term']['title.keyword'] = (string)$csvRow[1];
      $whereArray['bool']['must'][] = $rowArray;
      

      【讨论】:

        猜你喜欢
        • 2015-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多