Builder.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Elasticsearch\Model\Adapter\Index;
  7. use Magento\Framework\Locale\Resolver as LocaleResolver;
  8. use Magento\Elasticsearch\Model\Adapter\Index\Config\EsConfigInterface;
  9. class Builder implements BuilderInterface
  10. {
  11. /**
  12. * @var LocaleResolver
  13. */
  14. protected $localeResolver;
  15. /**
  16. * @var EsConfigInterface
  17. */
  18. protected $esConfig;
  19. /**
  20. * Current store ID.
  21. *
  22. * @var int
  23. */
  24. protected $storeId;
  25. /**
  26. * @param LocaleResolver $localeResolver
  27. * @param EsConfigInterface $esConfig
  28. */
  29. public function __construct(
  30. LocaleResolver $localeResolver,
  31. EsConfigInterface $esConfig
  32. ) {
  33. $this->localeResolver = $localeResolver;
  34. $this->esConfig = $esConfig;
  35. }
  36. /**
  37. * {@inheritdoc}
  38. */
  39. public function build()
  40. {
  41. $tokenizer = $this->getTokenizer();
  42. $filter = $this->getFilter();
  43. $charFilter = $this->getCharFilter();
  44. $settings = [
  45. 'analysis' => [
  46. 'analyzer' => [
  47. 'default' => [
  48. 'type' => 'custom',
  49. 'tokenizer' => key($tokenizer),
  50. 'filter' => array_merge(
  51. ['lowercase', 'keyword_repeat'],
  52. array_keys($filter)
  53. ),
  54. 'char_filter' => array_keys($charFilter)
  55. ]
  56. ],
  57. 'tokenizer' => $tokenizer,
  58. 'filter' => $filter,
  59. 'char_filter' => $charFilter,
  60. ],
  61. ];
  62. return $settings;
  63. }
  64. /**
  65. * {@inheritdoc}
  66. */
  67. public function setStoreId($storeId)
  68. {
  69. $this->storeId = $storeId;
  70. }
  71. /**
  72. * @return array
  73. */
  74. protected function getTokenizer()
  75. {
  76. $tokenizer = [
  77. 'default_tokenizer' => [
  78. 'type' => 'standard',
  79. ],
  80. ];
  81. return $tokenizer;
  82. }
  83. /**
  84. * @return array
  85. */
  86. protected function getFilter()
  87. {
  88. $filter = [
  89. 'default_stemmer' => $this->getStemmerConfig(),
  90. 'unique_stem' => [
  91. 'type' => 'unique',
  92. 'only_on_same_position' => true
  93. ]
  94. ];
  95. return $filter;
  96. }
  97. /**
  98. * @return array
  99. */
  100. protected function getCharFilter()
  101. {
  102. $charFilter = [
  103. 'default_char_filter' => [
  104. 'type' => 'html_strip',
  105. ],
  106. ];
  107. return $charFilter;
  108. }
  109. /**
  110. * @return array
  111. */
  112. protected function getStemmerConfig()
  113. {
  114. $stemmerInfo = $this->esConfig->getStemmerInfo();
  115. $this->localeResolver->emulate($this->storeId);
  116. $locale = $this->localeResolver->getLocale();
  117. if (isset($stemmerInfo[$locale])) {
  118. return [
  119. 'type' => $stemmerInfo['type'],
  120. 'language' => $stemmerInfo[$locale],
  121. ];
  122. }
  123. return [
  124. 'type' => $stemmerInfo['type'],
  125. 'language' => $stemmerInfo['default'],
  126. ];
  127. }
  128. }