I would recommend creating an Application Page that would forward the user to the url of the Document ID requested. But, you need Visual Studio and the ability to deploy farm solutions and sometimes a lighter approach works just as well.
You could do it with javascript. You would have to use a web part page or wiki page and add a Content Editor Web Part to the page, which is described here. Then, you could use the javascript client object model to get the field values, and you would end up with something to the effect of:
<script>
var documentInfoItems;
ExecuteOrDelayUntilScriptLoaded(function() {
var docId = getParameterByName("DocID");
if (docId) {
var ctx = new SP.ClientContext.get_current();
var lst = ctx.get_web().get_lists().getByTitle('DocumentLookupList');
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml("<View><Query><Where><Eq><FieldRef Name=\'Document_x0020_ID\'/>" +
"<Value Type=\'Number\'>" +
docId +
"</Value></Eq></Where></Query><RowLimit>1</RowLimit></View>");
documentInfoItems = lst.getItems(camlQuery);
ctx.load(documentInfoItems);
ctx.executeQueryAsync(Function.createDelegate(this, this.GetDocumentInfoSucceeded),
Function.createDelegate(this, this.GetDocumentInfoFailed));
}
}, "sp.js")
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
function GetDocumentInfoSucceeded(sender, args) {
var listItemEnumerator = documentInfoItems.getEnumerator();
if (listItemEnumerator.moveNext()) {
window.location.replace(listItemEnumerator.get_current().get_item("URL"));
} else {
alert("Unable to find document with id " + getParameterByName("DocID"));
}
}
function GetDocumentInfoFailed(sender, args) {
alert("Unable to get document info");
}</script>
Since you would be using a page in SharePoint, you could then just add some text like "Loading your document, please wait..."