как первая группа и показать все результаты поиска [дубликат]

@ Robert: Я пытался адаптировать ваш код с относительным путем и создал командный файл для запуска VBS.

VBS запускается и закрывается, но не запускает макрос ... Любая идея о том, где проблема может быть?

Option Explicit

On Error Resume Next

ExcelMacroExample

Sub ExcelMacroExample() 

  Dim xlApp 
  Dim xlBook 

  Set xlApp = CreateObject("Excel.Application")
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  strFilePath = objFSO.GetAbsolutePathName(".") 
  Set xlBook = xlApp.Workbooks.Open(strFilePath, "Excels\CLIENTES.xlsb") , 0, True) 
  xlApp.Run "open_form"


  Set xlBook = Nothing 
  Set xlApp = Nothing 

End Sub

Я удалил «Application.Quit», потому что мой макрос вызывает пользовательскую форму, заботясь об этом.

Cheers

EDIT

Я действительно сработал, на случай, если кто-то захочет запустить пользовательскую форму «как таковое»:

Проблемы, с которыми я столкнулся:

1 - Я не хотел использовать событие Workbook_Open, поскольку excel заблокирован только для чтения. 2 - Командная команда ограничена тем фактом, что (насколько мне известно) она не может вызвать макрос.

Сначала я написал макрос для запуска моей пользовательской формы при скрытии приложения:

Sub open_form()
 Application.Visible = False
 frmAddClient.Show vbModeless
End Sub

Затем я создал vbs для запуска этого макроса (выполнение этого с относительным путем было сложным):

dim fso
dim curDir
dim WinScriptHost
set fso = CreateObject("Scripting.FileSystemObject")
curDir = fso.GetAbsolutePathName(".")
set fso = nothing

Set xlObj = CreateObject("Excel.application")
xlObj.Workbooks.Open curDir & "\Excels\CLIENTES.xlsb"
xlObj.Run "open_form"

И я, наконец, сделал пакетный файл для выполнения VBS ...

@echo off
pushd %~dp0
cscript Add_Client.vbs

Обратите внимание, что я также включил «Установить обратно в видимый» в мой Userform_QueryClose:

Private Sub cmdClose_Click()
Unload Me
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ThisWorkbook.Close SaveChanges:=True
    Application.Visible = True
    Application.Quit
End Sub

В любом случае, спасибо за вашу помощь, и я надеюсь, что это поможет если кому-то это нужно

64
задан Kristoffer la Cour 7 June 2011 в 01:56
поделиться

4 ответа

Этот может придавать повышенную значимость желаемой головной части. Он не будет удваивать его, но он может быть достаточно хорошим для вас:

SELECT pages.*,
       MATCH (head, body) AGAINST ('some words') AS relevance,
       MATCH (head) AGAINST ('some words') AS title_relevance
FROM pages
WHERE MATCH (head, body) AGAINST ('some words')
ORDER BY title_relevance DESC, relevance DESC

-- alternatively:
ORDER BY title_relevance + relevance DESC

Альтернативой, которую вы также хотите исследовать, если у вас есть гибкость для переключения механизма БД, является Postgres . Это позволяет установить вес операторов и поиграть с ранжированием.

130
ответ дан Denis de Bernardy 17 August 2018 в 14:40
поделиться
  • 1
    В стороне MySQL 5.6 поддерживает полнотекстовый поиск в таблицах InnoDB! – Jabari 25 February 2013 в 23:12
  • 2
  • 3
    Какое негативное влияние оказывает несколько поисков? Мне понадобится 4 совпадения с моим SELECT, так как у меня 4 разных весовых коэффициента. Это сделает производительность намного ниже? – ToBe 23 November 2015 в 10:56
  • 4
    @ToBe Я видел на других подобных вопросах более одного человека говорят, что нет лишних накладных расходов при использовании нескольких MATCH операторов из-за того, как MySQL работает внутри страны. – BadHorsie 8 June 2016 в 18:27

Я никогда не делал этого, но это похоже на

MATCH (head, head, body) AGAINST ('some words' IN BOOLEAN MODE)

Если дает двойной вес совпадениям, найденным в голове.


Просто прочитайте этот комментарий на странице docs , подумал, что он может быть полезен вам:

Отправлено Patrick O'Lone от 9 декабря 2002 6:51

В документации должно быть указано, что IN BOOLEAN MODE почти всегда возвращает значение 1.0. Чтобы получить значимость, которая имеет смысл, вам нужно:

SELECT MATCH('Content') AGAINST ('keyword1 keyword2') as Relevance 
FROM table 
WHERE MATCH ('Content') AGAINST('+keyword1+keyword2' IN BOOLEAN MODE) 
HAVING Relevance > 0.2 
ORDER BY Relevance DESC 

Обратите внимание, что вы выполняете регулярный запрос релевантности для получения коэффициентов релевантности в сочетании с WHERE который использует BOOLEAN MODE. BOOLEAN MODE дает вам подмножество, которое удовлетворяет требованиям поиска BOOLEAN, запрос релевантности удовлетворяет коэффициенту релевантности, а предложение HAVING (в данном случае) гарантирует, что документ имеет отношение к поиску (то есть документы, набравшие менее 0,2 считаются неактуальными). Это также позволяет вам заказывать по релевантности. Это может быть или не быть ошибкой в ​​том, как работает режим BOOLEAN MODE, хотя комментарии, которые я прочитал в списке рассылки, позволяют предположить, что рейтинг релевантности в BOOLEAN MODE не очень сложный, поэтому он плохо себя зарекомендовал для фактического предоставления соответствующих документов. BTW. Я не заметил потери производительности для этого, так как кажется, что MySQL выполняет только поиск FULLTEXT один раз, даже если два предложения MATCH отличаются. Используйте EXPLAIN, чтобы доказать это.

Так что вам, возможно, не придется беспокоиться о вызове полнотекстового поиска дважды, хотя вы все равно должны «использовать EXPLAIN, чтобы доказать это»

9
ответ дан jisaacstone 17 August 2018 в 14:40
поделиться
  • 1
    К сожалению, добавление главы дважды в функцию match () не работает. Может быть, потому, что запрос не подсчитывает количество раз, когда слова происходят? И я использую эту страницу, на которую вы ссылаетесь, но я почему-то не могу заставить ее работать ... Я еще не индексировал мои столбцы, и поэтому не могу выполнить поиск без тега «IN BOOLEAN MODE». .. – Kristoffer la Cour 7 June 2011 в 03:04
  • 2
    Я думаю, что небулевой поиск будет возвращать # из вхождений, но boolean не делает? – jisaacstone 7 June 2011 в 03:08
  • 3
    Завтра я буду смотреть дальше, но сейчас я собираюсь удержаться. Спасибо за ответ, мы посмотрим, поможет ли он мне, когда я получу это. – Kristoffer la Cour 7 June 2011 в 03:21
  • 4
    У меня возникла проблема с использованием IN BOOLEAN MODE, а затем упорядочение по релевантности, и это решило мою проблему с релевантностью, всегда возвращаемой как 1. Спасибо. – Jazzy 1 November 2012 в 23:24
  • 5
    Создание поля оценки позволило решить мою проблему: я получал результаты, но многие из них были полным шумом. Спасибо, +1 – Chris Baker 23 July 2013 в 20:40

Я тоже играл с этим. Один из способов добавить лишний вес - в область ORDER BY кода.

Например, если вы сопоставляли 3 разных столбца и хотели более тяжело нагружать определенные столбцы:

SELECT search.*,
MATCH (name) AGAINST ('black' IN BOOLEAN MODE) AS name_match,
MATCH (keywords) AGAINST ('black' IN BOOLEAN MODE) AS keyword_match,
MATCH (description) AGAINST ('black' IN BOOLEAN MODE) AS description_match
FROM search
WHERE MATCH (name, keywords, description) AGAINST ('black' IN BOOLEAN MODE)
ORDER BY (name_match * 3  + keyword_match * 2  + description_match) DESC LIMIT 0,100;
3
ответ дан Noah King 17 August 2018 в 14:40
поделиться
  • 1
    Разве это не очень тяжелый вопрос? – Beanow 15 October 2013 в 16:29
  • 2
    Переместите математику в инструкцию select, и она значительно облегчит нагрузку. SELECT search.*, (MATCH (name) AGAINST ('black' IN BOOLEAN MODE) * 3) + (MATCH (keywords) AGAINST ('black' IN BOOLEAN MODE)*2 + MATCH (description) AGAINST ('black' IN BOOLEAN MODE)) AS totalScore , FROM search WHERE MATCH (name, keywords, description) AGAINST ('black' IN BOOLEAN MODE) ORDER BY totalScore DESC LIMIT 0,100; – invertedSpear 14 October 2014 в 20:01

Просто добавьте, кто может понадобиться. Не забудьте изменить таблицу!

ALTER TABLE table_name ADD FULLTEXT(column_name);
9
ответ дан Termininja 17 August 2018 в 14:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: