2013-12-05 6 views
0

У меня есть некоторые поисковые индексы на моем документе с голландским анализатором, и он работает очень хорошо. Например, рассмотрим:Нечеткий поиск с помощью Cloudant/Lucene не дает результатов

http://wetten.cloudant.com/regelingen/_design/RegelingInfo/_search/regeling?q=burgerlijke

Когда я пытаюсь сделать мои поиски нечеткие, все идет не так:

http://wetten.cloudant.com/regelingen/_design/RegelingInfo/_search/regeling?q=burgerlijke~

Возврат: 0 все вдруг результаты. Как это может быть?


Edit:

Дизайн документа:

{"_id": "_design/RegelingInfo", 
    "_rev": "11-20993b8c49d8bcc1cd4fde58e5f40b27", 
    "views": { 
     "all": { 
      "map": "function(doc) { \n if (doc._id.lastIndexOf('BWB', 0) === 0){\n emit(null, doc._id)\n }\n}" 
     } 
    }, 
    "lists": {}, 
    "shows": {}, 
    "language": "javascript", "filters": {}, "updates": {}, "indexes": { 
    "regeling": { 
     "analyzer": { 
      "name": "dutch", 
      "stopwords": ["wet", "regeling", "besluit"] 
     }, 
     "index": "function(doc) {\n var globalString = new Array();\n index(\"displayTitle\", doc.displayTitle, {\"store\": \"yes\"});\n globalString.push(doc.displayTitle);\n /*index(\"officieleTitel\", doc.officieleTitel, {\"store\": \"no\"});*/\n globalString.push(doc.officieleTitel);\n /*index(\"bwbid\", doc._id);*/\n globalString.push(doc._id);\n index(\"regelingSoort\", doc.regelingSoort, {\"store\": \"no\"});\n if (doc.citeertitels) {\n  for (var i = 0; i < doc.citeertitels.length; i++) {\n   /*index(\"citeertitel\", doc.citeertitels[i].titel, {\"store\": \"no\"});*/\n   globalString.push(doc.citeertitels[i].titel);\n  }\n }\n if (doc.afkortingen) {\n  for (var i = 0; i < doc.afkortingen.length; i++) {\n   /*index(\"afkorting\", doc.afkortingen[i], {\"store\": \"no\"});*/\n   globalString.push(doc.afkortingen[i]);\n  }\n }\n if (doc.nietOfficieleTitels) {\n  for (var i = 0; i < doc.nietOfficieleTitels.length; i++) {\n   /*index(\"nietOfficieleTitel\", doc.nietOfficieleTitels[i], {\"store\": \"no\"});*/\n   globalString.push(doc.nietOfficieleTitels[i]);\n  }\n }\n if (doc.xml) {\n  /* Remove tags to get inner text*/\n  index(\"innerText\", doc.xml.replace(/<[^>]*>/g, \"\"), {\"store\": \"no\"});\n }\n index(\"default\", globalString.join(\" \"), {\"store\": \"no\"});\n}" 
    } 
}} 

отформатированный функция индексирования:

function(doc) { 
    var globalString = new Array(); 
    index("displayTitle", doc.displayTitle, {"store": "yes"}); 
    globalString.push(doc.displayTitle); 
    /*index("officieleTitel", doc.officieleTitel, {"store": "no"});*/ 
    globalString.push(doc.officieleTitel); 
    /*index("bwbid", doc._id);*/ 
    globalString.push(doc._id); 
    index("regelingSoort", doc.regelingSoort, {"store": "no"}); 
    if (doc.citeertitels) { 
     for (var i = 0; i < doc.citeertitels.length; i++) { 
      /*index("citeertitel", doc.citeertitels[i].titel, {"store": "no"});*/ 
      globalString.push(doc.citeertitels[i].titel); 
     } 
    } 
    if (doc.afkortingen) { 
     for (var i = 0; i < doc.afkortingen.length; i++) { 
      /*index("afkorting", doc.afkortingen[i], {"store": "no"});*/ 
      globalString.push(doc.afkortingen[i]); 
     } 
    } 
    if (doc.nietOfficieleTitels) { 
     for (var i = 0; i < doc.nietOfficieleTitels.length; i++) { 
      /*index("nietOfficieleTitel", doc.nietOfficieleTitels[i], {"store": "no"});*/ 
      globalString.push(doc.nietOfficieleTitels[i]); 
     } 
    } 
    if (doc.xml) { 
     /* Remove tags to get inner text*/ 
     index("innerText", doc.xml.replace(/<[^>]*>/g, ""), {"store": "no"}); 
    } 
    index("default", globalString.join(" "), {"store": "no"}); 
} 
+0

, пожалуйста, добавьте здесь свой код, тогда мы обнаружим ошибки в вашей программе. –

+0

Добавил мой проектный документ! – Maarten

ответ

2

Вы можете видеть, что делает анализатор;

curl 'http://wetten.cloudant.com/_search_analyze -d '{"analyzer":"dutch","text":"burgerlijke"}' 

который возвращается;

{"tokens":["burger"]} 

Этот запрос;

curl 'https://wetten.cloudant.com/regelingen/_design/RegelingInfo/_search/regeling?q=burger~' 

возвращает 575 строк.

Это неловко, однако, это должно быть сделано для вас. Мы рассмотрим это.

+0

Роберт Ньюсон предположил, что это Lucene, потому что нечеткие запросы не анализируются. (?) Значит ли '' 'в конце вашего запроса что-то особенное? – Maarten

+1

Нет, это просто шум, я использую zsh not bash, который заставляет меня правильно процитировать, так что строка получается из строки, такой как «curl» url here ». –

+1

Мы получаем совпадения, если * пользователь * выполняет вывод, это моя точка. С конечной точкой _search_analyze вы можете автоматизировать это. Это неудобно, и я хотел бы улучшить его, если не окажется, что мы сталкиваемся с фундаментальной Люценой. –

1

Я не знаю точно ничего о голландском языке, но я сильно подозреваю, что проблема происходит.

DutchAnalyzer, как и большинство анализаторов, специфичных для конкретного языка, включает в себя стеблемер, чтобы соответствовать альтернативным формам слов с одним и тем же корневым словом (т.е. Однако подстановочные, нечеткие, регулярные выражения и т. Д. Запросы не анализируются. TermQueries.

Так что, если burgerlijke становится значительно стебли в индексе (кажется, достаточно вероятно, не будучи знакомым с языком), то вполне возможно, что изменить расстояние между на стебли Vesion и неуправляемую версию просто слишком большое чтобы увидеть матч. Если в индексе было указано, что «гамбургер», это расстояние редактирования 5 от нечеткого запроса «burgerlijke», что слишком далеко, чтобы получить результат.

В целом, стволовые не играют хорошо с любыми MultiTermQuery.

+0

Это странно - вы говорите, что термин запроса не анализируется, но * * возвращается к его стеблю? Желательно ли это поведение?Попытка стебля (гамбургер); запрос 'burger ~' возвращает * inburgering *, * burgers * и * burgerlijk *. – Maarten

+0

Ах, индексированные слова, конечно, не связаны с запросом! Итак, нет способа объединить нечеткий оператор с анализаторами языка? – Maarten

1

Да, все дело в анализе. Вот полезная (но недокументированная) конечная точка API, чтобы помочь отладить эти вещи. Подставьте свои собственные имя пользователя/учетные данные, но тогда это просто:

curl 'https://malortmike.cloudant.com/_search_analyze?analyzer=dutch&text="burgerlijke"' 
{"tokens":["burger"]} 

curl -u 'malortmike:secret' 'https://malortmike.cloudant.com/_search_analyze?analyzer=standard&text="burgerlijke"' 
{"tokens":["burgerlijke"]} 

Fun, чтобы увидеть различные анализаторы на работе.

Смежные вопросы