Elasticsearch не возвращает совпадения в единственном / множественном числе - PullRequest
9 голосов
/ 09 ноября 2011

Я использую php-библиотекуasticsearch для индексирования и поиска документов на моем веб-сайте. Это код для создания индекса:

curl -XPUT 'http://localhost:9200/test/' -d '
{
  "index": {
    "numberOfShards": 1,
    "numberOfReplicas": 1
  }
}'

Затем я использую curl XPUT для добавления документов в индекс и XGET для запроса индекса. Это работает хорошо, за исключением того факта, что единственное и множественное число слов запроса не совпадают по всему индексу при возвращении результатов. Например, когда я ищу «обсуждения», совпадения с «обсуждением» не возвращаются, и наоборот. Почему это так? Я думал, что об этом по умолчанию позаботится вasticsearch. Есть ли что-то, что мы должны явно упомянуть, чтобы оно соответствовало формам единственного / множественного числа?

Ответы [ 3 ]

7 голосов
/ 09 ноября 2011

Анализатор elascticsearch по умолчанию не подходит для обработки, это то, что вам нужно для обработки множественного числа / единственного числа.Вы можете попробовать использовать Snowball Analyzer для своих текстовых полей, чтобы увидеть, работает ли он лучше для вашего варианта использования:

curl -XPUT 'http://localhost:9200/test' -d '{
    "settings" : {
        "index" : {
            "number_of_shards" : 1,
            "number_of_replicas" : 1
        }
    },
    "mappings" : {
        "page" : {
            "properties" : {
                "mytextfield": { "type": "string",  "analyzer": "snowball", "store": "yes"}
            }
        }
    }
}'
6 голосов
/ 20 декабря 2012

Поскольку фильтр 'porterStem' является сверхчувствительным, он больше подходит, если вы используете фильтр 'minimal_english'.«porterStem» создает подобные токены для таких слов, как:

, поиск «Test» приведет к «Test», «Tests», «Testing», «Tester» и т. д.al.

Но «minimal_english» даст только результат - «Тест» и «Тесты».

6 голосов
/ 14 ноября 2011

Почему-то снежный ком у меня не работает ... получаю ошибки, как я упоминал в комментарии к ответу @ imotov.Я использовал стебель портера, и он отлично сработал для меня.Это конфиг, который я использовал:

curl -XPUT localhost:9200/index_name -d '
{
"settings" : {
    "analysis" : {
        "analyzer" : {
            "stem" : {
                "tokenizer" : "standard",
                "filter" : ["standard", "lowercase", "stop", "porter_stem"]
            }
        }
    }
},
"mappings" : {
    "index_type_1" : {
        "dynamic" : true,
        "properties" : {
            "field1" : {
                "type" : "string",
                "analyzer" : "stem"
            },
            "field2" : {
                "type" : "string",
                "analyzer" : "stem"
            }
         }
      }
   }
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...