Вопрос по html_strip


(Alexey) #1

Всем привет!
Вопрос от новичка

Я все продолжаю играться с тестовой базой и потом переношу что получилось на свою

Вопрос такой:

Я добавил "char_filter": "html_strip", в analysis, но текст в "properties" : {
"body" : { "type" : "string", "analyzer" : "russian_morphology" }, продолжает укладываться с тегами.
Я где-то запутался в синтаксисе?

#!/bin/sh
curl -XDELETE 'http://192.168.200.43:9200/rustest' && echo
curl -XPUT 'http://192.168.200.43:9200/rustest' -d '{
    "settings": {
		"analysis": {
			"analyzer": {
				"my_analyzer": {
					"type": "custom",
          "char_filter": "html_strip",
					"tokenizer": "standard",
					"filter": ["lowercase", "russian_morphology", "english_morphology", "my_stopwords"]
				}
			},
			"filter": {
				"my_stopwords": {
					"type": "stop",
					"stopwords": "а,без,более,бы,был,была,были,было,быть,в,вам,вас,весь,во,вот,все,всего,всех,вы,где,да,даже,для,до,его,ее,если,есть,еще,же,за,здесь,и,из,или,им,их,к,как,ко,когда,кто,ли,либо,мне,может,мы,на,надо,наш,не,него,нее,нет,ни,них,но,ну,о,об,однако,он,она,они,оно,от,очень,по,под,при,с,со,так,также,такой,там,те,тем,то,того,тоже,той,только,том,ты,у,уже,хотя,чего,чей,чем,что,чтобы,чье,чья,эта,эти,это,я,a,an,and,are,as,at,be,but,by,for,if,in,into,is,it,no,not,of,on,or,such,that,the,their,then,there,these,they,this,to,was,will,with"
				}
			}
		}
	}
}' && echo
curl -XPUT 'http://192.168.200.43:9200/rustest/type1/_mapping' -d '{
	"type1": {
	    "_all" : {"analyzer" : "russian_morphology"},
    	"properties" : {
        	"body" : { "type" : "string", "analyzer" : "russian_morphology" },
          "targetId" : { "type" : "string", "analyzer" : "russian_morphology" }
    	}
	}
}'

Пробывал обойти это с помощью https://www.npmjs.com/package/striptags , но там теги удаляются бекспейсом и слова просто склеиваются если между тегами не было пробелов, укладываясь в эластик одним словом, будет ли у меня с данным фильтром эластика такая же проблема?

Например в документе у меня
Ford Henry
Vladimir Petrovich

А в базу попадает Ford HenryVladimir Petrovich т.к. разметку просто удалило бэкспейсом.


(Igor Motov) #2

Вы в настройках настроили my_analyzer, а в меппинге продолжаете использовать стандартный russian_morphology. Попробуйте так:

curl -XPUT 'http://192.168.200.43:9200/rustest/type1/_mapping' -d '{
    "type1": {
        "_all" : {"analyzer" : "my_analyzer"},
        "properties" : {
            "body" : { "type" : "string", "analyzer" : "my_analyzer" },
            "targetId" : { "type" : "string", "analyzer" : "my_analyzer" }
        }
    }
}'

(Alexey) #3

Я так пробывал сделать. Получается вот что:

В документе

Джекки Чан
Арнольд Шварценеггер
Япония

В базу кладется как (с лишними тегами в body)

  {
    "_index": "rustest",
    "_type": "type1",
    "_id": "someId_someProp",
    "_score": 1,
    "_source": {
      "body": "<p>Джекки Чан</p><p>Арнольд Шварценеггер</p><p>Япония</p>",
      "targetId": [
        "sxid3553-dca3-4f12-98ae-19d231d77c17"
      ]
    }
  },

Изменил вот на такой:

' && echo
curl -XPUT 'http://192.168.200.43:9200/rustest/type1/_mapping' -d '{
	"type1": {
	    "_all" : {"analyzer" : "my_analyzer"},
    	"properties" : {
        	"body" : { "type" : "string", "analyzer" : "my_analyzer" },
          "targetId" : { "type" : "string", "analyzer" : "my_analyzer" }
    	}
	}
}'

(Igor Motov) #4

Анализаторы влияют только на то, как документ индексируется. В _source документ сохраняется в том виде, в котором вы его добавили. Я думал, вы хотите добиться того, чтобы поиск по тегам (p в данном случае) не возвращал вам все записи. В вашем случае HTML надо убирать до того, как документ добавляется в elasticsearch.


(Alexey) #5

Значит буду в ручную перенос строк на пробелы заменять и потом чистить от html https://www.npmjs.com/package/striptags

Спасибо большое за ответ!


(system) #6